在这段代码中:
#include <iostream>
int main(void)
{
std::string {} = "hi";
return 0;
}
这种声明在C++中是合法的。请参见Godbolt。
- 它是什么意思?
- 它为什么是合法的?
补充信息,我测试了这个程序从c++11到c++20标志,因为从c++11开始可用扩展初始化器。
std::string::operator=(const char*)
没有被&符号标记,这意味着它允许对左值和右值进行赋值操作。
有些人认为(1)赋值运算符应该被&符号标记来禁止对右值进行赋值:
(1) 例如,面向安全关键C++开发的《高完整性C++标准》中的规则12.5.7建议“使用ref-qualifier &声明赋值运算符”。(来源)
struct S {
S& operator=(const S&) & { return *this; }
};
int main() {
S {} = {}; // error: no viable overloaded '='
}
或者,更明确地说:
struct S {
S& operator=(const S&) & { return *this; }
S& operator=(const S&) && = delete;
};
int main() {
S {} = {}; // error: overload resolution selected deleted operator '='
}
std::string {} = "hi";
基本上是一个空操作。提到实际行为可能仍然有价值,不仅仅是允许编写此语句的原因。 - JojOatXGMEstd::string
的特定示例而言,即:“在特定情况下,例如std::string {} =“hi”;
,该语句将不起作用。但是,根据构造函数,赋值运算符和可能的复制构造函数,使用std::string
以外的其他类型时,这样的表达式可能会产生副作用。”无论如何,这并不是很重要。如果您认为这可能会引起误解,您可以将其保留原样。我只是觉得您基本上忽略了“它是什么意思”的部分,所以觉得有些奇怪。 - JojOatXGME
std::string
,然后调用它的operator=(const char*)
ж–№жі•гЂ‚ - UnholySheep