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

2024-03-08

我遇到了一个奇怪的问题。如果我尝试编译自赋值对象引用,我的编译器(针对 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 显示有关自分配的警告,但即便如此,它显然应该是一个错误。在什么情况下这种行为是合法的?


在什么情况下这种行为是合法的?

No. [dcl.ref]/5 http://eel.is/c++draft/dcl.ref#5.sentence-3 states:

应初始化引用以引用有效的对象或函数。

您的示例涉及以以下方式初始化引用:doesn't引用一个有效的对象,因此它的格式不正确。一般来说,由于明显的原因,这并不总是能够诊断出来......但是在这里,很明显这是一个错误,这就是为什么两者gcc https://wandbox.org/permlink/jAebSTLzgZUEOyIH and clang https://wandbox.org/permlink/jAebSTLzgZUEOyIH对此发出警告。

只有 clang 显示有关自分配的警告,但即便如此,它显然应该是一个错误。

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

无论如何,这是一个很容易纠正的问题。如果您想要错误,请使用-Werror。而现在它is两者都有错误gcc https://wandbox.org/permlink/RJjgOgh8vOZS93px and clang https://wandbox.org/permlink/Nb566FbW1LJ4jImV。无论如何,这通常是一个好习惯。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么初始化器列表中的自初始化引用不是错误? 的相关文章

随机推荐