【发布时间】:2014-05-17 11:42:26
【问题描述】:
我可以在 c++11 中使用带有右值字段的类/结构吗? 喜欢这个:
template<typename T>
struct RvalueTest{
RvalueTest(T&& value) : value( std::forward<T>(value) ){}
T&& value;
};
因为在下面的测试中:
class Widget {
public:
Widget(){std::cout << "Widget ctor " << std::endl; }
Widget(int h) : h(h){std::cout << "Widget ctor param " << std::endl; }
Widget(const Widget&) { std::cout << "Widget copy ctor " << std::endl; }
Widget(Widget&&) { std::cout << "Widget move ctor " << std::endl; } // added this
template<typename T>
Widget(const T&) { std::cout << "Generalized Widget copy ctor " << std::endl; }
template<typename T>
Widget(T&&) { std::cout << "Universal Widget ctor " << std::endl; }
int h;
};
RvalueTest<Widget> r(Widget(12));
std::cout << r.value.h;
我在输出时得到了一些垃圾值(使用 -O2):
http://coliru.stacked-crooked.com/a/7d7bada1dacf5352
Widget ctor param
4203470
使用 -O0 正确的值:
http://coliru.stacked-crooked.com/a/f29a8469ec179046
Widget ctor param
12
为什么???
附:我试图实现的是单个 ctor 调用,没有任何额外的移动/复制构造函数。
更新
clang 编译正常 http://coliru.stacked-crooked.com/a/6a92105f5f85b943
海湾合作委员会错误?还是按原样工作?
【问题讨论】:
标签: c++11 rvalue-reference rvalue