[英]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:
如果構造函數直接或間接地委托給自己,程序就是格式錯誤; 無需診斷。
所有編譯器都是正確的 - 代碼被破壞了,編譯器不需要告訴你。 此時你有UB; 來自[intro.compliance]¶2:
如果程序包含違反不需要診斷的規則,則本國際標准不要求對該程序的實施。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.