数组初始化器必须是一个初始化列表,但错误未显示。

3

我很难理解为什么这段代码似乎能够运行。我不应该得到一个“数组初始化器必须是初始化列表”的错误吗?

#include <iostream>

class B {
public:
  B() { std::cout << "B Constructor " << std::endl ; }
  B(const B&) { std::cout << "B Copy Constructor " << std::endl ; }
  ~B() { std::cout << "B Destructor " << std::endl ; }
} ;

class A {
public:
  A() { std::cout << "A Constructor " << std::endl ; }
  A(const A& other) : bs(other.bs)
        { std::cout << "A Copy Constructor " << std::endl ;}
  ~A() { std::cout << "A Destructor " << std::endl ; }
private:
  B bs[12] ;
};


int main() {
    A a ;
    A b(a) ;
    return 0 ;
}

g++ --version 的输出为 g++ (GCC) 4.4.7 20120313 (Red Hat 4.4.7-18)

。这是一个关于 IT 技术的内容。

1
添加一个标准标志(--std=c++0x--std=c++03),以及-pedantic-errors标志,你会发现这是一个扩展。如果这样做没有帮助,那么GCC 4.4.7存在一个错误。 - StoryTeller - Unslander Monica
1
非常有趣。在godbolt上,所有版本的gcc都可以编译此代码,而所有版本的clang都无法通过编译。我怀疑这是gcc的一个bug/扩展。不幸的是,在这种情况下,即使使用-pedantic选项,gcc也没有改变任何东西。 - NathanOliver
1
可能是重复问题,与第二个答案中的相关错误报告有关:https://dev59.com/9GAf5IYBdhLWcg3wsUXT - NathanOliver
1个回答

4

这是不规范的,且GCC存在一个错误。您指定了GCC 4.4.7版本,因此我将基于C++11回答。初始化程序的含义由[dcl.init]/16确定:

初始化器的语义如下。目标类型是正在初始化的对象或引用的类型,源类型是初始化器表达式的类型。如果初始化器不是单个(可能带括号的)表达式,则源类型未定义。
  • 如果初始化程序是非括号的大括号初始化列表,则对象或引用被列表初始化。
  • 如果目标类型是引用类型,请参阅[dcl.init.ref]。
  • 如果目标类型是字符数组、char16_t数组、char32_t数组或wchar_t数组,并且初始化器是字符串字面值,请参阅[dcl.init.string]。
  • 如果初始化器是(),则对象将进行值初始化。
  • 否则,如果目标类型是数组,则程序无效。
必须按顺序检查项目符号以确定目标类型的初始化器的含义。由于您使用(other.bs)作为初始化器,而目标类型是一个数组,唯一适用的项目符号是我突出显示的那个。程序无效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接