有一个像这样的
String
类:
class String
{
public:
String() { }
...
void test() && { std::cerr << "right version" << std::endl; }
void test() & { std::cerr << "left version" << std::endl; }
void test_ctor(String &&s) { std::cerr << "right version" << std::endl; }
void test_ctor(const String &s) { std::cerr << "left version" << std::endl; }
...
private:
...
}
和
main.cpp
:
int main()
{
String().test();
String lhs;
lhs.test();
([]() -> String { return String(); })().test();
lhs.test_ctor(lhs);
lhs.test_ctor(String());
}
会产生什么样的输出?
String()
是右值还是左值?
我的输出:
right version
left version
right version
left version
left version
那就是
String().test(); // right version
String lhs;
lhs.test(); // left version
([]() -> String { return String(); })().test(); // right version
lhs.test_ctor(lhs); // left version
lhs.test_ctor(String()); // left version
在
String().test()
,这是一个正确的值。lhs.test_ctor(String())
处,它是左值。String() 是右值还是左值?
String()
是右值表达式。另请注意,术语“左值”和“右值”在 C++ 中并未正式使用。正确的术语是左值和右值。