[C++] 傳遞一個C ++對像到它自己的構造函數合法嗎?


Answers

構造函數在為將要分配的對象分配內存的地方調用。 此時,該位置不存在任何對象(或可能是具有微不足道的析構函數的對象)。 此外, this指針指向的是內存和內存正確對齊。

由於它是分配和對齊的內存,我們可以使用Foo類型的左值表達式(即Foo& )來引用它。 我們可能沒有做的是有一個左值到右值的轉換。 只有在構造函數體輸入後才允許。

在這種情況下,代碼只是試圖在構造函數體內打印&bar 。 在這裡打印bar.member甚至是合法的。 由於已經輸入構造函數體,因此存在Foo對象並且可以讀取其成員。

這給我們留下了一個小細節,這就是名稱查找。 在Foo foo(foo) ,第一個foo在範圍中引入了名稱,第二個foo因此返回到剛剛聲明的名稱。 這就是為什麼int x = x是無效的,但int x = sizeof(x)是有效的。

Question

我驚訝地意外發現以下作品:

#include <iostream>            
int main(int argc, char** argv)
{
  struct Foo {
    Foo(Foo& bar) {
      std::cout << &bar << std::endl;
    }
  };
  Foo foo(foo); // I can't believe this works...
  std::cout << &foo << std::endl; // but it does...
}

我將構造對象的地址傳遞給它自己的構造函數。 這看起來像來源級別的循環定義。 標準是否真的允許你在對象構造之前將一個對像傳遞給一個函數,或者這種未定義的行為?

我想這並不奇怪,因為所有的類成員函數都有一個指向其類實例的數據的指針,作為一個隱式參數。 數據成員的佈局在編譯時是固定的。

請注意,我不問這是否有用或是一個好主意; 我只是在學習更多的課程。