2012-10-15 91 views
6

我觀察到奇怪的行爲在g ++ 4.6.3。當通過調用類的構造函數創建一個臨時File(arg)編譯器選擇忽略的arg存在和解析表達式爲File arg;調用構造函數與成員作爲參數分析爲變量定義

  • 爲什麼成員名稱忽略?
  • 標準說的是什麼?
  • 如何避免它? (不使用新的{}語法)
  • 是否存在相關的編譯器警告? (我可以用一個任意字符串ARG,它仍然會默默耕耘)

代碼:

#include <iostream> 

class File { 
public: 
    explicit File(int val) : m_val(val) { std::cout<<"As desired"<< std::endl; } 
    File() : m_val(10) { std::cout<< "???"<< std::endl;} 

private: 
    int m_val; 
}; 

class Test { 
public: 
    void RunTest1() { File(m_test_val); } 
    void RunTest2() { File(this->m_test_val); } 
    void RunTest3() { File(fhddfkjdh); std::cout<< "Oops undetected typo"<< std::endl; } 
private: 
    int m_test_val; 
}; 

int main() 
{ 
    Test t; 
    t.RunTest1(); 
    t.RunTest2(); 
    t.RunTest3(); 
    return 0; 
} 

輸出:

$ ??? 
$ As desired 
$ Oops undetected typo 
+0

只有當您創建對象或使用新位置時,才能直接調用構造函數。 – chris

+0

'fhddfkjdh'如何工作?這是無處定義的,應該會導致編譯錯誤? – RvdK

+0

@PoweRoy,它被視爲:'File fdfdsfsda()' – Xyand

回答

2

的編譯器將行:

File(m_test_val); 

as

File m_test_val; 

所以你實際上使用默認的構造函數創建了一個名爲m_test_val的命名對象。 File(fhddfkjdh)也一樣。

解決方案是 - 這告訴編譯器,您想使用該成員來創建一個命名對象。另一個將命名對象 - File x(m_test_val)

+2

另一個解決方案是使用統一的初始化語法:'File {m_test_val}'。 – Mankarse

+0

@Mankarse從問題 - 「不使用新的{}語法」 –

+0

haha​​ha * facepalm * – Mankarse

相關問題