复制构造函数给出编译错误

copy constructor gives compilation error

提问人:user2621476 提问时间:8/17/2016 最后编辑:Peter Kuser2621476 更新时间:8/18/2016 访问量:133

问:

  void print_me_bad( std::string& s ) {
      std::cout << s << std::endl;
  }

  void print_me_good( const std::string& s ) {
      std::cout << s << std::endl;
  }

  std::string hello( "Hello" );

  print_me_bad( hello );  // Compiles ok
  print_me_bad( std::string( "World" ) );  // Compile error
  print_me_bad( "!" ); // Compile error; 
  print_me_good( hello ); // Compiles ok

  print_me_good( std::string( "World" ) ); // Compiles ok
  print_me_good( "!" ); // Compiles ok 

在上面的复制构造函数程序中,为什么在第二种情况下,当我传递“World”时会出现编译错误?

C++ 引用 常量 复制构造函数 临时

评论

3赞 songyuanyao 8/17/2016
Temporary 不能绑定到对 non-const 的引用。
3赞 Some programmer dude 8/17/2016
在您显示的代码中,任何地方都没有复制构造。这个问题与左值和右值(基本上是“临时”对象)之间的差异以及对常量和非非常量对象的引用之间的差异有关。
0赞 Niall 8/17/2016
将临时对象绑定到引用( 是必需的) - herbsutter.com/2008/01/01/...const

答:

0赞 Peter K 8/17/2016 #1

如注释中所述,您不能将临时对象绑定到非常量引用。

在以下情况下:

print_me_bad( std::string( "World" ) );  // Compile error
print_me_bad( "!" ); // Compile error; 

创建一个临时 std::string 对象。首先是显式 (),然后通过隐式转换 ( 转换为 std::string)。这是不允许的。std::string( "World" )"!"

但是,您可以将临时引用绑定到 const 引用,这就是为什么其他情况编译得很好的原因:

print_me_good( std::string( "World" ) ); // Compiles ok
print_me_good( "!" ); // Compiles ok