C++ 右值参考和可视化2013

C++ 右值参考和可视化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()是右值表达式,

在VS2013
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