【发布时间】:2013-12-06 02:35:23
【问题描述】:
我试图弄清楚如何在 is_assignable 的实现中解释 declval<_dest>() = declval<_src>()。
declval 将类型转换为引用。鉴于此,我将表达式转换为以下四种可能性之一:
- _Dest&& = _Src&&
- _Dest&& = _Src&
- _Dest& = _Src&&
- _Dest& = _Src&
然后我创建了两个辅助函数。
template <typename T> T rvalue();
template <typename T> T& lvalue();
我的理解是使用模板函数可以实现这四个表达式。
- _Dest&& = _Src&& -----> 右值<_dest>() = 右值<_src>()
其他三个也一样。
然后我通过编译三对具体类型的每种可能性的模板函数版本来模拟 decltype(declval<_dest>() = declval<_src>(), ..)。
- _Dest=int,_Src=int。编译器接受#3 和#4。 is_assignable 为 #3 和 #4 返回 true。他们同意了。
- _Dest=int,_Src=double。与 相同的结果
- _Dest=double,_Src=int。对于这个,编译器和 is_assignable 不同意。编译器再次不喜欢分配给右值。但是,is_assignable 对所有四种可能性都返回 true。
我的问题是
- 我是否正确解释了 declval<_dest>() = declval<_src>()?换句话说,这是否真的转化为四种可能性。如果是,是否可以将每个都映射到模板化函数表达式?
- 为什么编译器和 is_assignable 在 _Dest=double, _Src=int 情况下存在分歧?
谢谢。
【问题讨论】:
-
哪个编译器是“那个”编译器?至少一个编译器似乎可以工作precisely as you expect。
-
编译器为VC++2013