以下示例代码编译。
#define USE_RVALUE // line 1
template<class data_type>
class Container
{
data_type& data;
public:
#ifdef USE_RVALUE
Container(data_type&& _data) : data(_data) {}
#endif
Container(data_type& _data) : data(_data) {}
};
int main()
{
double d = 42.0;
Container<double> c1(d);
Container<double> c2(1.0f); // line 18
return 0;
}
我的编译器命令:
g++ -std=c++11 -Wall ref.cpp -o ref # g++ is 4.7.1
如果我们注释掉第 1 行,g++ 会抱怨:
no matching function for call to ‘Container<double>::Container(float)’
ref.cpp:18:34: note: candidates are:
ref.cpp:11:9: note: Container<data_type>::Container(data_type&) [with data_type = double]
ref.cpp:11:9: note: no known conversion for argument 1 from ‘float’ to ‘double&’
[... (more candidates)]
当然,错误很明显,C++03 中的一个典型错误:References from rvalues are not allowed, if these rvalues are not const. 但为什么它与右值构造函数(即#ifdef
启用)一起工作?我们在初始化列表中有同样的情况:从非常量值引用。
另外,如果你解释一下……这段代码是“良好的编码风格”还是“避免”?