C++ 右值参考和可视化2013
在VS2013C++ 右值参考和可视化2013,c++,rvalue-reference,C++,Rvalue Reference,在VS2013vec.push_back(Foo())下是否正常调用Foo(Foo&f)? 我认为Foo()是左值。这是正常的。由于通过调用Foo()创建的实例从未分配给变量,因此编译器将其视为r值 一个简单的经验法则是,您创建的任何未指定名称(即未声明)的对象都将是r值 为了更好地解释细节,我建议在中使用第6.4.1节。我只是认为visual 2013不遵守规范。Foo()是左值,所以Foo(Foo&&)通常不应该是左值called@Guillaume07:这是错误的,Foo()是右值表达式,
vec.push_back(Foo())下是否正常代码>调用Foo(Foo&f)
?
我认为Foo()是左值。这是正常的。由于通过调用Foo()创建的实例从未分配给变量,因此编译器将其视为r值
一个简单的经验法则是,您创建的任何未指定名称(即未声明)的对象都将是r值
为了更好地解释细节,我建议在中使用第6.4.1节。我只是认为visual 2013不遵守规范。Foo()是左值,所以Foo(Foo&&)通常不应该是左值called@Guillaume07:这是错误的,Foo()
是右值表达式,而不是左值expression@David罗德里格斯:但在visual下,我可以在Foo()前面使用address操作符,因此我认为Foo()是一个左值。@Guillaume07在表达式vec.push_back(Foo())中
,Foo()
没有标识;即您无法获得在当前块中创建的值。因此,这就是所谓的prvalue
@Guillaume07:这是VisualStudio编译器中的一个怪癖。获取Foo()
的地址是非法的。如果禁用语言扩展,编译器很可能会禁用此“功能”。Foo()
不是左值
#include<iostream>
#include<vector>
struct Foo
{
int *nb;
Foo() :nb(new int(5)){}
~Foo(){ delete nb; }
Foo(Foo&& f)
{
std::cout << "Move\n";
nb = f.nb;
f.nb = 0;
}
};
std::vector<Foo> vec;
void func()
{
vec.push_back(Foo());
}
int main()
{
func();
std::cout << *(vec[0]).nb << "\n";
std::cin.ignore();
}
> ./a.out
Move
5