2016-09-21 12 views
-7

私はいつもC言語のCスタイルのキャストはreinterpret_castと同じだと読んでいます。しかし、Visual Studioでこのコードをテストしたところ、Cスタイルのキャストは静的なキャストと同じ動作をしているようです。なぜ誰が知っていますか?これはバグのように思える...C++でのCスタイルのキャストが奇妙な動作をする

#include <string> 
#include <iostream> 

class Thing1 
{ 
    std::string theString; 

public: 
    Thing1(const std::string& theString) : theString(theString) 
    { 
     // 
    } 

    std::string getTheString() 
    { 
     return theString; 
    } 
}; 

class Thing2 
{ 
    std::string theString; 

public: 
    Thing2(const std::string& theString) : theString(theString) 
    { 
     // 
    } 

    std::string getTheString() 
    { 
     return theString; 
    } 
}; 

class Thing3 : public Thing1, public Thing2 
{ 
public: 
    Thing3(const std::string& theString1, const std::string& theString2) : Thing1(theString1), Thing2(theString2) 
    { 
     // 
    } 
}; 

int main() 
{ 
    Thing3* thing3 = new Thing3("string1", "string2"); 
    uintptr_t t3ptr = (uintptr_t)thing3; 
    uintptr_t t1ptr = (uintptr_t)((Thing1*)thing3); 
    uintptr_t t2ptr = (uintptr_t)((Thing2*)thing3); 
    std::cout << t1ptr << std::endl; 
    std::cout << t2ptr << std::endl; 
    std::cout << t3ptr << std::endl; 
    std::cin.ignore(); 
    return 0; 
} 

このコードは出力が得られます。

17563752 
17563780 
17563752 
+0

Cスタイルのキャストは、reinterpret_castと必ずしも同じである必要はありません。 C++では、Cスタイルのキャストはreinterpret_castまたはstatic_castが実行しない場合はconst_castと同等です。私は物事を過度に単純化していないことを願っていますが、それはその問題の要点だと私は信じています。 – antred

+6

*「私はいつもC言語のCスタイルのキャストはreinterpret_castと同じだと読んでいます」* - あなたは正しく覚えていないか、読んだ資料の選択に特に不利でした。 – IInspectable

+1

C++のキャスト* always *を使用することをお勧めします。彼らはもっと明示的にあなたがしたいことを言っています*彼らはソースコードで検索する方が簡単です。もちろん、*最高の*はコードを設計することで、(あるいはごくわずかな)キャストが必要となることはありません。 –

答えて

7

Cスタイルのキャストはreinterpret_castは同じではありません。

キャストの概要は、ここで見つけることができ、次の順序 http://en.cppreference.com/w/cpp/language/explicit_cast

A)はconst_cast(式)

b)static_cast(式)拡張子:ポインタまたは派生クラスへの参照は、ベースクラスにアクセスできない場合でも(つまりその逆の場合でも)明示的なベースクラスへのポインタまたは参照へのキャストがさらに許可されます。このキャストはプライベート継承指定子を無視します)。あいまいでない非仮想ベースのメンバーへのポインタへのメンバーへのポインタのキャストにも同じことが適用されます。

c)static_cast(拡張子付き)とそれに続くconst_cast;

d)reinterpret_cast(expression);

e)reinterpret_castとそれに続くconst_cast。

+0

wowはその行動を決めましたか?ダムとして地獄 – Finke

+2

@フィンケ:明らかに、注文は、標準委員会によって設定された。順序はセクション[cast.expr]、パラグラフ4にリストされています。 – jxh

+6

@Finke:コンパイラーがバグを持っていると思った人は、ドキュメントを読むのに気を使うことができなかったと言います。この動作は、常に 'reinterpret_cast'ingよりもはるかに優れており、とにかくC言語でキャストがどのように動作するかに近いものです。 '(int)5.5'のようなものは、Cスタイルのキャストが' reinterpret_cast'のために短手であったとしても機能しませんでした。もし 'reinterpret_cast'が要求に応じてちょっとした型打ちをしたとしたらほとんどの場合、表現は役に立たないでしょう。 – GManNickG