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类),因此无法工作。
答案 0 :(得分:1)
Clang ++具有相同的行为。当未初始化时,您将c0
的值传递给默认的复制构造函数,而没有收到“在此处使用时未初始化”警告。 (写一个私有的拷贝构造函数来确认。)
我认为正在发生的事情是direct-list-initialization
。我不知道标准是否需要诊断,但是值得提交关于。