在c++ 11中将非const左值引用绑定到右值是否有效?(修改)
Is it valid to bind non-const lvalue-references to rvalues in C++ 11?(modified)
我知道在c++03中,一个非const引用不能绑定到右值。
T& t = getT();
是无效的,在c++11中,我们可以这样做:T&& t = getT();
,但是上面的代码呢,应该在c++11中工作吗?
我用vs11测试了下面的代码:
Foo getFoo() {
return Foo();
}
void fz(Foo& f) {
}
int getInt() {
return int();
}
void iz(int& i) {
}
int main() {
{
Foo& z = getFoo(); //ok
fz(getFoo()); //ok
int& z2 = getInt(); //error: initial value of reference to non-const must be an lvalue
iz(getInt()); //same as above
}
}
Foo
是一个自定义类,我不明白为什么前两行编译。z
的临时引用在main的内部作用域结束时被销毁。标准对此有什么规定吗?
class Foo {
public:
Foo() {
std::cout << "constructedn";
}
~Foo() {
std::cout << "destructedn";
}
};
我刚刚看到一个类似的问题:一个VS2010 bug ?允许绑定非const引用到右值,甚至没有警告?
应该在c++11中工作吗?
不,它不应该。
Foo
是一个自定义类,我不明白为什么前两行编译
只能用MSVC编译。MSVC有一个(很有用的)编译器扩展,它允许将用户定义类型的左值绑定到右值,但是标准本身禁止这样做。请看下面的例子,GCC 4.7.2拒绝编译你的代码。
标准对此有规定吗?
确实如此。c++ 11标准第8.5.3/5段:
对类型"
cv1 T1
"的引用由类型"cv2 T2
"的表达式初始化,如下所示:—如果引用是左值引用,且初始化表达式
-是左值(但不是位域),"
是引用兼容的cv1 T1
"与"cv2 T2
"或-有一个类类型(即
T2
是一个类类型),其中T1
与T2
不是引用相关的,但可以是隐式转换为类型为"cv3 T3
"的左值,其中"cv1 T1
"与"cv3 T3
"引用兼容[…],则在第一种情况下,引用被绑定到初始化表达式lvalue和lvalue结果的转换(或在任何一种情况下,转换为适当的基类子对象)对象)。[…]
[…]
- 否则,该引用必须是对非易失性const类型的左值引用(即cv1必须是)const),或者引用必须是右值引用。(例子:
double& rd2 = 2.0; // error: not an lvalue and reference not const int i = 2; double& rd3 = i; // error: type mismatch and reference not const
-end example]
不能将临时类型绑定到非const左值引用。
T f();
T& t1 = f(); // won't compile
const T& t2 = f(); // OK
T&& t3 = f(); // OK
这是一个安全功能。用一个无论如何都要死亡的左值来改变临时变量很可能是一个逻辑错误,因此语言是不允许的。
注意,由于RVO比在实践中:
T&& t3 = f();
和
T t3 = f();
相当于。
- 如果变量名称不跟在 char* 后面,const char* 是否有效?
- 钳制迭代器是否有效
- 检查由括号、方括号和大括号组成的一组方括号是否有效?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 模板签名解析为 void(void) 被 GCC 拒绝;这是否有效C++?
- 我如何知道作为参数的size_t在函数中是否有效?
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 此递归模板类型定义是否有效C++?
- 将 C 函数转换为 C++ 以检查数字是否有效
- 函数参数的名称与调用函数时使用的变量相同是否有效?
- 如何检查输入是否有效?
- 如何检查用户的输入是否有效以及我正在寻找的数字?
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- 如何检查isupper(cstr)是否有效?
- 将 std::transform 与 std::back_inserter 一起使用是否有效?
- 只需要知道我在c ++中打印模式的方式是否有效,或者有另一种方法可以有效地做到这一点
- 如何检查字符串格式在读取C++文本文件时是否有效?
- 在 c++ 中将对象设置为等于同一类的构造函数是否有效?
- 创建加密安全密码.并验证它是否有效