2012-01-10 14 views
3

特定の暗黙の変換が期待どおりに機能しない理由を理解するのに問題があります。私は次のクラスに演算子wchar_t **()はconst wchar_tへの暗黙的な変換を提供できません** - なぜですか?

ref class ManagedWStringArrayWrapper 
{ 
    wchar_t** m_pointer; 

public: 

    operator wchar_t**() 
    { 
     return m_pointer; 
    } 
}; 

を持っているし、私も**これは、暗黙的にconstのwchar_tに変換するだろうと思った - しかし、それはしません。誰かが私に理由を教えてくれますか? T**からT const**

+0

この演算子の使用方法のサンプルを提供できますか? –

+1

これに関するC++ FAQに関する記事があります:http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.17 –

+0

+1興味深いです。単一レベルの間接化(wchar_t *)の場合、const wchar_t *()演算子は暗黙の変換を許可します。間違いが発生した複数のレベルの間接参照のみです。 C++の喜び – adelphus

答えて

3

変換はあなたが実際に—を期待するかもしれないほど直感的ではない、それがconst -incorrectコードとして標準自体に例として与えられています。所与

例は:しばらく

#include <cassert> 

int main() { 
    char* p = 0; 

    //char const** a = &p; // not allowed, but let's pretend it is 
    char const** a = (char const**)&p; // instead force the cast to compile 

    char const* orig = "original"; 
    *a = orig; // type of *a is char const*, which is the type of orig, this is allowed 

    assert(p == orig); // oops! char* points to a char const* 
} 

研究上記のシナリオこれはない変換T*T const*と同じであることが明らかになるであろう。どういたしまして!

私はa blog postに同じ質問をしました。よくある質問はan entry on itです。

+0

同様に、 'Derived **'を 'Base **'に暗黙的に変換することはできません。同様の理由から、もしあなたが「Derived * pd、** ppd = &pd; Base ** ppb = ppd; * ppb = new Base; '型システムからの反論を伴わない' Base'オブジェクトへのポインタを含む 'pd'となり、型なしの何かが起こっていることを読者に警告する明示的なキャストはありません。 –

0

これらは異なるものです。たとえば、C++ライブラリを見ると、同じことをするための関数が2つあることがあります.1つはconstポインタで、もう1つは非constで動作します。 Example.

ただし、明示的な演算子const wchar_t**を簡単に追加できます。

+0

@Mr Listerの行を読む - const wchar_t **演算子を追加すると(試してみましたか?)、戻り値を明示的にキャストしない限り失敗します。問題はなぜですか? – adelphus

+0

いいえ、同じ理由ではありません。変換を 'wchar_t *'に追加すると、暗黙的に 'wchar_t const *'に変換できます。 –

+0

はい、私は試してみました。そしてそれは集められた。私のソースを投稿したいですか? –