可以在构建时修改命名 std::string 吗?

Possible to modify named std::string on construction?

有谁知道为什么注释行编译失败但未注释行没问题?

#include <iostream>

int main()
{
    // std::string foo("hello").erase(2); // This doesn't compile...
    std::string("hello").erase(2);        // ...but this does.
}

包含注释行会导致此错误:

main.cpp: In function ‘int main()’:
main.cpp:5: error: expected ‘,’ or ‘;’ before ‘.’ token

有人可以解释一下关于修改匿名对象和命名 std::string 对象的规则是什么吗?

创建命名局部、全局或命名空间范围变量的语句称为定义。定义 不是 表达式,您不能指望表达式中允许的所有内容在定义中也允许。定义严格限于初始化它定义的对象。

第二个语句是一个表达式,因此您可以在其中调用您希望的对象上的任何成员函数。

这是一个与语言语法有关的问题。声明是 语句 ,而临时创建是 表达式 。这两者在语言中的处理方式截然不同,并且受制于不同的规则。

声明是一个语句,您可以在其中给出变量的类型、名称和一些对其进行初始化的表达式。因此,例如,您可以写

std::string foo("hello");

std::string foo = "hello";

但是,你不能写

std::string foo("hello").erase(2);

仅仅是因为该语言规定那里不允许使用该语法。我的意思是, 明白你在说什么,而且我认为大多数人可能也会这样,但语言上说你不能那样做。但是,您可以写

std::string foo = std::string("hello").erase(2);

因为声明语句允许您提供任意表达式作为初始值设定项。

另一方面,表达式

std::string("hello").erase(2)

作为表达式是完全合式的,因为可以通过创建临时对象或调用不同对象的成员函数来构建表达式。

所以说真的,没有理由不能设计语言来让你所做的事情合法,但它只是不合法't 这样设计的。