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类型),因此无法工作.
Clang++ 具有相同的行为。c0您将未初始化时的值传递到默认复制构造函数中,而不会收到“此处使用时未初始化”警告。(编写一个私有复制构造函数来确认。)
我认为正在发生的事情是direct-list-initialization。我不知道标准是否需要诊断,但值得提交一份错误报告。
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |