c++中的构造函数是右值还是左值

问题描述 投票:0回答:1

有一个像这样的

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())
处,它是左值。
这很令人困惑。

c++ constructor return-type
1个回答
0
投票

String() 是右值还是左值?

String()
是右值表达式。另请注意,术语“左值”和“右值”在 C++ 中并未正式使用。正确的术语是左值和右值。

© www.soinside.com 2019 - 2024. All rights reserved.