簡體   English   中英

重新排序成員聲明

[英]Reordering member declaration

在C ++標准中有3.3.7 / 1的引號:

如果對類中的成員聲明重新排序會在(1)和(2)下產生一個替代的有效程序,則該程序格式不正確,則不需要診斷。

這是什么意思? 您能否獲得此類重新排序描述的示例?

考慮以下程序:

double foo;
class Bar {
    std::vector<decltype(foo)> v;
    int foo;
};

重新排列 Bar::vBar::foo像這樣:

double foo;
class Bar {
    int foo;
    std::vector<decltype(foo)> v;
};

會產生一個其他有效的替代程序,因此該程序違反了引用的規則。

gcc(的一個版本)選擇在第一種情況下發出錯誤,但使用第二種變型進行編譯(“無需診斷”)。

std::vector<decltype(::foo)> v; std::vector<decltype(Bar::foo)> v; 是有效的替代方法(只有在首先聲明Bar::foo時才可能使用后者)。

這種情況的一個例子是常見錯誤,您可以在對象構造上遇到該錯誤。 代碼變體1和2對此進行了說明。 代碼變體1:

class C
{
  C() : a1(0), a2(a1)
  {
  }

  int a1;
  int a2;
};

代碼變體2:

class C
{
  C() : a1(0), a2(a1)
  {
  }

  int a2;
  int a1;
};

請注意,在變體2中,a1和a2成員的聲明順序已更改。 好的編譯器會在代碼變體2上發出警告:“成員初始化與聲明順序不同”。 問題在於,在代碼變體2中,程序行為未定義。 一些編譯器將生成將a2初始化為0的代碼(例如,據我所猜測的是Visual Studio編譯器),一些編譯器將生成其中a2值未定義的代碼,而在代碼變體1中,任何編譯器都將提供正確的代碼。 這就是您需要的示例。

暫無
暫無

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

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