2013-06-20 32 views
8

是否可以寫一個類等,這些都是有效的:我可以將隱式初始化重載爲0嗎?

Foo a; 
Foo b = 0; 
Foo c = b; 
Foo d(0); 
Foo e(1); 
Foo f = Foo(1); 

但這些都不是:

int x; 
Foo a = x; 
Foo b = 1; 
Foo c = 2; 
//etc 

從本質上講,我的原則是「常量0隱式轉換爲一個Foo ,但沒有其他值是「

+0

約'美孚E(1)什麼;'?這有效嗎? –

+0

@LuchianGrigore:它們在語義上是否相同?如果是這樣,我想我可以宣佈無效。 – Eric

+1

也許你可以使用構造採取'的std :: nullptr_t'(只是一個想法...) –

回答

5

如果你不介意Foo b = nullptr;工作,它很容易被破解。有一個明確的構造函數從int,並從std::nullptr_t隱含。

如果不介意的工作,我不知道這是可能的。區分字面0和其他整數文字的唯一方法是前者隱式轉換爲指針,nullptr_t。所以nullptr會喜歡nullptr_t參數指針參數,因此具有兩個構造,你可以過濾掉nullptr參數。然而,0的指針和nullptr_t的轉換是相同的排名,所以這會殺了0參數與不確定性。

嗯...這樣的事情可能工作:

class Foo { 
    struct dummy; 
public: 
    explicit Foo(int); // the version that allows Foo x(1); 
    Foo(dummy*); // the version that allows Foo x = 0; 
    template <typename T, 
      typename = typename std::enable_if< 
       std::is_same<T, std::nullptr_t>::value>::type> 
    Foo(T) = delete; // the version that prevents Foo x = nullptr; 
}; 

我並沒有真正嘗試過這一點。從理論上講,當參數是nullptr時,模板只應該參與重載解析,否則SFINAE會將其殺死。但是,在這種情況下,它應該比指針構造函數更好。

0
Foo e(1); 

將ca將Foo的非顯式構造函數作爲參數使用int。 本質上這一行將通過嘗試使用此int構造函數將int轉換爲Foo來執行相同操作。

Foo b = 1; 

你不能阻止INT直接處理的某些價值觀。 如果你有你的構造函數explicit,你也不能寫下一行。

Foo b = 0; 

gx_正確說明0可以轉換爲std :: nullptr_t。 以下內容適用於您的意圖。

Foo(std::nullptr_t x) : member(0) { } 
explicit Foo(int c) : member(c) { } 
// ... 
Foo a = 0; // compiles 
Foo b = 1; // doesn't compile 

// Note: 
int do_stuff (void) { return 0; } 
Foo c = do_stuff(); // doesn't compile 
+0

不,指示按與禁止複製的初始化。 –

+1

怎麼樣的'明確美孚(INT);'加上'美孚(nullptr_t);'? –

+0

+1,而橫向思維,但可能 – Pixelchemist

-1

我有一個想法是:

Foo(const uint32_t c) : member(0) { static_assert(c == 0, "Nope"); } 
explicit Foo(uint32_t c) : member(c) { } 

這是否合理的行爲?

+2

甚至不會編譯。就重載解析而言,'const uint32_t'參數和'uint32_t'參數是相同的。 –

-1

我承認我還沒有實現的C++ 11尚未右值語義完全掌握,但這似乎做你想要什麼:

class Foo 
{ 
    public: 
    Foo(int&&) {} 
}; 

int main() 
{ 
    Foo a(123); 
    int x = 123; 
    Foo b(x); // error here, line 11 
    return 0; 
} 

結果:

prog.cpp:11: error: cannot bind ‘int’ lvalue to ‘int&&’

評論歡迎,如果此代碼有任何我沒有注意到的警告,或者如果你可以向我保證它沒有。

+0

有趣,但我的目標是'x == 0'的具體情況; – Eric

+0

@eric啊,沒有意識到。你說'Foo e(1);'應該是有效的:/ – Oktalist

相關問題