构造函数在 G++ 和 CLang++ 中委托给自身
constructor delegates to itself in g++ & clang++
考虑以下程序。我不小心弄错了。
struct T {
int s;
T() : T() {
s=9;
}
};
int main() {
T t;
}
上面的代码编译&在g++的某些版本中运行良好,如g++4.8.1(请参阅此处的实时演示)&clang++3.6.0(见这里的现场演示)&在MSVC++2015中,但在运行时崩溃。它给了我分割错误错误。我认为这是由于递归,我的意思是递归调用构造函数。但是g++的最新版本&clang++未能编译此代码,给出以下错误:
g++4.9.2给出以下错误(请参阅此处的实时演示)
prog.cc: In constructor 'T::T()':
prog.cc:3:10: error: constructor delegates to itself
T() : T() {
clang++给出以下错误(请参阅此处的实时演示)
main.cpp:4:8: error: constructor for 'T' creates a delegation cycle [-Wdelegating-ctor-cycles]
T() : T() {
^
1 error generated.
所以,这里的问题是,根据标准,哪个编译器在这里?这是其中一个编译器的错误吗?上面的程序到底发生了什么?如果我的理解有错,请纠正我。为什么同一个程序在不同版本的编译器中表现出不同的行为?
从C++11,[class.base.init]¶6:
如果构造函数直接或间接地委托给自己,则程序是不正确的;不需要进行诊断。
所有的编译器都是对的——代码是坏的,编译器不需要告诉你;来自[介绍合规性]¶2:
如果某个程序违反了不需要诊断的规则,则本国际标准对该程序的实现没有任何要求。
相关文章:
- 奇怪的结构&GCC&clang(void*返回类型)
- 数据成员SFINAE的C++17测试:gcc vs clang
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- Clang bug?使用指针作为模板参数
- clang整洁10忽略了我的NOLINT命令
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在clang++预处理器中确定gcc工具链版本
- 为什么 Clang 不允许"and"作为函数名称?
- 带有 -stdlib=libc++ 的 clang++ 9.0.1 找不到<optional>
- clang格式:宏的缩进
- CLANG 编译器 说:变量"PTR"可能未初始化
- clang格式:禁用排序包含
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 循环展开 - G++ 与 Clang++
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- 一位朋友将模板函数缩写为clang和gcc
- 类模板参数推导-clang和gcc不同