参考右值

时间:2015-10-05 00:37:36

标签: c++ reference lvalue rvalue

根据开放标准(http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2027.html

此代码应该出错:

A&  a_ref3 = A();  // Error!
A&& a_ref4 = A();  // Ok

然而,我能够做第一行就好了。而第二行实际上对我来说是错误的。我正在使用Visual Studio中的Visual C ++ 14进行编译。

class foo {

};

int main()
{

    foo x;
    foo() = x; // Valid

    foo& fr = foo(); // Valid

    string&& foo = "hey"; // Valid r reference

    foo&& frr = foo(); // Error!

    return 0;
}

所以我猜我的问题是foo()是左值?如果是这样,为什么Stroustrup说您不能为它分配引用类型?

1 个答案:

答案 0 :(得分:1)

foo& fr = foo();在VC ++中有效,因为编译器allows它,clang和gcc都拒绝这种语法。

另一方面,

foo&& frr = foo();是一个错误,因为您已重新声明foo并尝试在operator()上致电std::string,这不是books.joins('INNER JOIN stats ON stats.statsrecord_id = books.statsrecord_id AND stats.type = 2') .where(statsrecord_id: books.map(&:statsrecord_id).uniq) .group('library_id', 'library_name', 'address_1', 'address_2', 'city', 'state', 'postal_code') .page(1).limit(5).order('count_all DESC').count 。定义了。