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

Joh*_*erg 5 c++ gcc

UPDATE2:

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

struct C{
   C(){}   
};
struct D{
   C c0{c0};  // << -- compiles without warning
   C c1(c1);  // << -- does not compile
};
Run Code Online (Sandbox Code Playgroud)

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

我最后报告了这个,因为错误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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Ykt*_*ula 1

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

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