我试图弄清楚如何在is_assignable的实现中解释declval< _Dest>()= declval< _Src>()。
declval将类型转换为引用。鉴于此,我将表达式转换为以下四种可能性之一:
然后我创建了两个辅助函数。
template <typename T> T rvalue();
template <typename T> T& lvalue();
我的理解是可以使用模板函数实现四个表达式。
其他三个也一样。
然后我通过编译三对具体类型的每种可能性的模板化函数版本来模拟decltype(declval&lt; _Dest&gt;()= declval&lt; _Src&gt;(),..)。
我的问题是
感谢。
答案 0 :(得分:3)
std::declval
实际上被指定为(C ++11§20.2.4[declval] p1):
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept;
引用折叠规则(第8.3.2节[dcl.ref] p6)的结果是declval
在T
是左值引用类型时返回左值引用,否则返回右值引用。是的,你的解释是正确的。
如果您的编译器认为double&&
可以从任何类型分配,那么它就有一个错误。 §5.17[expr.ass] p1陈述:
赋值运算符(
=
)和复合赋值运算符从右到左分组。所有都需要可修改的左值作为左操作数,并返回左值操作数的左值。
[强调我的]。
许多程序员选择通过使用左值引用限定符声明赋值运算符来模拟此行为 - 仅限于左值 - 使用自己的类型:
class foo {
foo& operator = (const foo&) & = default;
foo& operator = (foo&&) & = default;
};