【问题标题】:Why doesn't this std::string C++ code give compile-time error?为什么这个 std::string C++ 代码不给出编译时错误?
【发布时间】:2015-11-30 16:27:33
【问题描述】:

我有以下sn-p:

#include <string>

int main(int argc, char *argv[])
{
    std::string a, b, c;
    a + b = c;
    return 0;
}

为什么这个 C++ 代码没有给出编译时错误?这可能是因为std::string::operator+ 的实现方式,但我的问题是:为什么要这样实现?在什么情况下需要这种行为?

【问题讨论】:

  • 为什么会出现编译错误? a+B 返回一个有效的字符串对象。至于用途?它可能无法使用
  • @DavidHaim OP 可能预计它会失败,原因与 a, b, cint 失败的原因相同。
  • 有人可以列出一个有效的用例吗?
  • @KarolyHorvath 任何有效的用例都会涉及带有副作用的构造函数、析构函数或operator=;在任何其他情况下,该表达式的行为 AS A noop, imho.
  • @PaoloM:我的意思是std::string

标签: c++ string move-semantics


【解决方案1】:

您可以分配给临时对象。没有规则可以防止这种情况发生。

如果您不希望在临时(更一般地,在 r-value 上)调用成员函数,您可以在函数声明中使用 ref-qualifier

但正如您所见,herestd::string::operator= 没有 ref-qualified 版本。

我不认为标准委员会允许这种行为是有明确目标的;我想这个选择背后的基本原理是给程序员施加尽可能少的规则,让他找到一个有用的应用程序,如果有的话。

【讨论】:

  • 我想问题是暂时的。 class X a,b,c; a+b = c; 的结果可能是可取的,因为临时变量会导致某些修改后的全局状态被更新。
  • 具有副作用的赋值运算符对我来说听起来像是一个巨大的反模式
  • @DarkWanderer 我不知道 throwing 是否可以被视为副作用,但可以肯定的是赋值运算符可以抛出。
  • 它可以,但是如果使用它,那么编写该代码的人将依赖那个抛出,这也有点代码味道。
  • @DarkWanderer 确实会
猜你喜欢
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 2016-01-21
  • 1970-01-01
相关资源
最近更新 更多