我正在努力弄清楚如何在declval<_Dest>() = declval<_Src>()的实现中解释is_assignable。
解密将类型转换为引用。有鉴于此,我将该表达式翻译为以下四种可能性之一:
然后我创建了两个助手函数。
template <typename T> T rvalue();
template <typename T> T& lvalue();据我理解,这四个表达式可以通过使用模板函数来实现。
其他三个人也是如此。
然后我模拟了解密类型(declval<_Dest>()= declval<_Src>(),..)通过编译模板函数版本的每一种可能的三对具体类型。
我的问题是
谢谢。
发布于 2013-12-06 03:33:12
std::declval实际上被指定为是(C++11§20.2.4解密p1):
template <class T>
typename add_rvalue_reference<T>::type declval() noexcept;引用折叠规则(§8.3.2 dcl.ref p6)的结果是,当T是lvalue引用类型时,declval返回一个lvalue引用,否则返回一个rvalue引用。所以是的,你的解释是正确的。
如果您的编译器认为double&&可以从任何类型分配,那么它就有一个bug。§5.17 expr.ass p1指出:
赋值运算符(
=)和复合赋值运算符都是由右向左分组的.它们都需要一个可修改的lvalue作为它们的左操作数,并返回一个引用左操作数的lvalue。
强调我的。
许多程序员选择通过使用lvalue引用限定符声明赋值操作符来模拟这种行为--只对lvalue进行测试--使用他们自己的类型:
class foo {
foo& operator = (const foo&) & = default;
foo& operator = (foo&&) & = default;
};https://stackoverflow.com/questions/20414883
复制相似问题