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

时间:2016-08-17 06:41:09

标签: c++ reference const copy-constructor temporary

  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”时会在第二种情况下出现编译错误?

1 个答案:

答案 0 :(得分:0)

如评论中所述,您无法将临时对象绑定到非const引用。

在以下情况中:

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

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

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

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