2011-11-23 86 views
77

當涉及到構造函數時,添加關鍵字explicit可防止熱心編譯器在不是程序員的第一意圖時創建對象。這種機制是否也適用於鑄造操作員?演員可以明確嗎?

struct Foo 
{ 
    operator std::string() const; 
}; 

這裏,比如,我想是能夠施展Foostd::string,但我不希望這樣的投含蓄髮生。

回答

94

是和否

這取決於您正在使用的C++版本。

  • C++ 98和C++ 03不支持explicit類型轉換運算符
  • 但是C++ 11一樣。

例,

struct A 
{ 
    //implicit conversion to int 
    operator int() { return 100; } 

    //explicit conversion to std::string 
    explicit operator std::string() { return "explicit"; } 
}; 

int main() 
{ 
    A a; 
    int i = a; //ok - implicit conversion 
    std::string s = a; //error - requires explicit conversion 
} 

g++ -std=c++0x編譯它,你會得到這樣的錯誤:

prog.cpp:13:20: error: conversion from 'A' to non-scalar type 'std::string' requested

在線演示:http://ideone.com/DJut1

但只要你寫:

std::string s = static_cast<std::string>(a); //ok - explicit conversion 

錯誤消失:http://ideone.com/LhuFd

順便說一句,在C++ 11中,顯式轉換操作被稱爲「上下文相關的轉換運算符」如果將其轉換爲布爾。另外,如果你想知道更多關於隱性和顯性的轉換,閱讀本主題:

希望有所幫助。

+1

+1。可以發佈一個C++ 11代碼的例子嗎? – FailedDev

+1

@FailedDev:完成。 :-) – Nawaz

+1

非常感謝! – FailedDev