簡體   English   中英

構造函數在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:

如果構造函數直接或間接地委托給自己,程序就是格式錯誤; 無需診斷。

所有編譯器都是正確的 - 代碼被破壞了,編譯器不需要告訴你。 此時你有UB; 來自[intro.compliance]¶2:

如果程序包含違反不需要診斷的規則,則本國際標准不要求對該程序的實施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM