没有编译器警告错误的支撑初始化程序

时间:2013-06-27 11:14:33

标签: c++ gcc

UPDATE2:

如所怀疑的,这与初始化列表构造函数无关。根据R. Martinho Fernandes的评论,显然它只是试图构造一个带有自身副本的对象,这个对象在使用大括号语法时未被检测到:

struct C{
   C(){}   
};
struct D{
   C c0{c0};  // << -- compiles without warning
   C c1(c1);  // << -- does not compile
};

问题仍然存在。这种情况下标准是否需要诊断?我确实意识到诊断不可能或不适用于各种错误。

我最后报告了这个问题,就像错误57758

原始问题:

我熟悉的人设法编写了错误的代码(由纯错误输入引起),最终产生虚假的bad_alloc异常。我想知道gcc(4.7.2和4.8.1)是否有充分的理由不对此发出警告。

此案例的标准是否需要诊断?我确实意识到诊断对于各种错误都是不可能或不实用的。

这归结为:

#include <initializer_list>
struct A{};
struct C{
   C(std::initializer_list<A*> as){}   
};
struct D{
   C c{c}; // <<- well...
};    
int main(){
   D d;
}

编辑:我提到initializer_list的原因是,如果删除初始化列表构造函数,我会收到错误:error: too many initializers for ‘C’

我认为这是因为没有用户定义的(用户声明的?)构造函数,我得到了聚合初始化,由于C中没有成员(C类),因此无法工作。

1 个答案:

答案 0 :(得分:1)

Clang ++具有相同的行为。当未初始化时,您将c0的值传递给默认的复制构造函数,而没有收到“在此处使用时未初始化”警告。 (写一个私有的拷贝构造函数来确认。)

我认为正在发生的事情是direct-list-initialization。我不知道标准是否需要诊断,但是值得提交关于。

的错误报告