缺少编译器警告,大括号初始值设定项不正确
lack of compiler warning with incorrect brace initializer
更新2:
正如所怀疑的那样,这与具有初始值设定项列表构造函数无关。根据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),所以聚合初始化不起作用。
Clang++也有相同的行为。当c0
的值未初始化时,您将其传递到默认的复制构造函数,而不会收到"在此处使用时未初始化"警告。(编写一个私有副本构造函数进行确认。)
我认为正在发生的是direct-list-initialization
。我不知道标准是否需要诊断,但值得提交一份错误报告。
相关文章:
- 使用2个键的cpp-stl::优先级队列排序不正确
- 正弦级数方程计算不正确
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 密码登录程序将永远循环并显示不正确的结果
- 在C++中返回不正确的楼层函数值
- 形状对象的旋转和缩放不正确C++
- C++ 读取文件读取文件不正确
- 编译器在构造函数中计算的成员偏移量不正确
- AIX编译器13.1.3对c++进行了不正确的双重转换
- 对从引用到 std::reference_wrapper 或编译器错误的隐式转换的理解不正确?
- 模板实例化失败:编译器选择不正确的重载函数
- "this" Lambda 捕获的是不正确的。海湾合作委员会编译器错误?
- 这是C++模板声明真的不正确还是我的编译器搞砸了
- 编译器如何优化不正确C++分层向下转换以导致真正的未定义行为
- 为什么编译器在这种情况下选择了不正确的函数重载
- Switch 中的多个情况不正确,未生成编译器错误
- c++应用程序找不到com dll,因为编译器使用不正确的guid生成.tlh文件
- 缺少编译器警告,大括号初始值设定项不正确
- C++ 项目布局似乎不正确,编译器找不到实现文件
- 英特尔2015编译器错误,RAII破坏不正确,这是一个错误还是我做错了什么