gpt4 book ai didi

c++ - 为什么初始化列表中的自初始化引用不是错误?

转载 作者:太空狗 更新时间:2023-10-29 20:51:44 24 4
gpt4 key购买 nike

我遇到了一个奇怪的问题。如果我尝试编译自评估对象引用,我的编译器(针对 ESP32)不会显示任何错误或警告。我调查了这个问题,发现有些编译器不会为这段代码显示任何错误或警告:

#include <iostream>
#include <string>

class Foo
{
public:
std::string s;
Foo(){ std::cout << "Foo()\n"; }
std::string ToString() { return s; }
};

class Bar
{
public:
Foo& foo;
Bar(): foo(foo) { std::cout << "Bar()\n"; }
std::string ToString() { return foo.ToString(); }
};

int main()
{
Bar bar;
std::cout << "START\n" << bar.foo.ToString() << "\nEND\n";
}

只有 clang 显示关于自赋值的警告,但即便如此,它显然应该是一个错误。这种行为在任何情况下都是合法的吗?

最佳答案

Is there any situation that this behavior could be legal?

没有。 [dcl.ref]/5状态:

A reference shall be initialized to refer to a valid object or function.

您的示例涉及以引用有效对象的方式初始化引用,因此它的格式不正确。由于明显的原因,这通常并不总是能够诊断出来……但在这里,很明显这是一个错误,这就是为什么 gccclang警告它。

Only clang shows a warning about self-assignment but even so it clearly should be an error.

标准并没有真正处理什么是警告什么是错误。它只涉及诊断。为什么这些编译器选择将其诊断为警告而不是错误?耸肩。

无论如何,这是一个很容易纠正的问题。如果你想要一个错误,用 -Werror 编译。现在它两个gcc 上的错误和 clang .无论如何,这通常是一个好习惯。

关于c++ - 为什么初始化列表中的自初始化引用不是错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48649307/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com