【问题标题】:usage of reference参考的使用
【发布时间】:2012-06-26 08:37:04
【问题描述】:
void fn(string &s)
{
    //....
}

//use the function    
fn("helloworld");

首先,用 const char 字符串初始化非 const 字符串是错误的。

我在参数中添加 const 后,它会编译。

但是在堆栈上引用一个临时对象字符串(“helloworld”)是否正确?

确定调用了 string("helloworld") 吗?

--

编辑。

如果创建了临时字符串,编译器如何从std::string(const char*)的构造函数判断对象string("helloworld")是const?

【问题讨论】:

  • 如果您询问是否会从 const char* 创建 string 对象,那么答案是肯定的,您可以在函数中安全地使用该字符串。
  • 创建了一个临时对象:conversion by constructorstd::string 析构函数在对象范围的末尾被调用 - 当fn() 返回时。

标签: c++


【解决方案1】:

但是在堆栈上引用一个临时对象字符串(“helloworld”)是否正确?

是的,只要引用是const,临时的生命周期就会延长。

确定调用了 string("helloworld") 吗?

是的,使用转换构造函数std::string(const char*) 创建了一个临时对象。但请注意,编译器可以优化此步骤。

【讨论】:

  • 编译器如何优化转换?如果被调用的函数需要一个std::string,而你给它一个char const[],那么一定会发生一些事情。
  • @JamesKanze 如果函数是内联的并且什么都不做怎么办?
  • 任何优化都必须遵循“好像”规则。如果编译器可以确定程序的可观察行为不会改变,那么它可以做任何事情。在这种情况下,它必须确定它不会调用的构造函数和析构函数中没有“可观察的行为”。 (理论上,这在这种情况下非常简单:std::string 是标准库的一部分,编译器可以神奇地知道关于它们的一切。据我所知,没有人知道,尽管在 @987654326 的情况下@,这很有意义。)
  • @JamesKanze 最后一句话只是为了反映这个极端情况,以完全回答 OP 的最后一个问题。我同意,这是一些无用的信息,但为了完整性。
  • @LuchianGrigore 如果创建了临时字符串,编译器如何从std::string的构造函数判断对象string("helloworld")为const。
【解决方案2】:

但是引用一个临时对象 string("helloworld") 是否正确 在堆栈上?

在这种情况下,可能,但您必须注意对象的生命周期。临时将在完整表达式结束时不复存在;如果fn 保存了一个指针或对它的引用,那么你就有麻烦了。这通常不是免费功能的问题,例如您的fn(但可以);如果临时变量是 new 表达式中构造函数的参数,则可能会出现问题(但该类的作者应记录超出构造函数调用的任何生命周期要求)。

【讨论】:

    【解决方案3】:

    但是在堆栈上引用一个临时对象字符串(“helloworld”)是否正确?

    是的,为什么不呢?

    确定调用了 string("helloworld") 吗?

    是的,只要string 提供了一个使用 const char* 参数的隐式构造函数,这是有保证的(std::string 这样做)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多