2011-09-14 7 views
1

一時オブジェクトの作成はコンパイラによって異なりますか?一時オブジェクトの作成はC++コンパイラによって異なりますか?

以下のコードでは、char *を送信する関数を呼び出しますが、関数にはObject参照が必要です。ただし、Objectにはchar *を使用するコンストラクタがあります。したがって、一時オブジェクトが自動的に作成され、print関数に送信されます。

class Object { 
    string text; 
    public: 
    Object (const char* value) { text = value; } 
    void print() const { printf("[%s]\n", text.c_str()); } 
}; 

void print(const Object& obj) { obj.print(); } 

int main() { 
    print("hello"); 
} 

この動作はコンパイラによって異なりますか? あなたはここに出力を見ることができます:あなたは、このようなコンストラクタ

Object (const char* value) 

を宣言するとhttp://codepad.org/AABw5Ulz

答えて

2

それはコンパイラが暗黙の型変換を行うことができることを意味します。

コンパイラに依存しない機能はありませんが、それはdesingによるものです。

コンパイラは"hello"を受け取り、print(const Object &obj)関数に送る前にObjectコンストラクタに渡すだけです。

+0

「コンパイラは許可されています」とは、正しい表現ではないと思います。これを行う方法は他にありません。コンパイラは、関数呼び出しの引数として 'Object'インスタンスを構築する*必須*です。 –

+0

私はどのようなコンパイラを使用していても、print(Object( "hello"))を書く必要はありません。それは非常に迷惑になるでしょう... – NIGO

+0

はいKerrek SB、それは許されますが、私はそれがその決定を下すか、またはコンパイルエラーを表示するかどうかは分かりませんでした。 – NIGO

3

あなたのケースはかなり明確です。一時的なものがなくなることがないかもしれない状況でもありません。むしろ、あなたのprintファンクションタイプの引数であるObjectを必要とするため、必ず構築する必要があります。

状況に応じて選択肢がありませんので、がコンパイラに依存している可能性があります。最適化の余地が残っている状況が必要だった場合は、値をvoid print(Object);で渡すことを検討できます。一時オブジェクトが一度コピーされるか、ターゲット関数で直接構築されるかはコンパイラによって異なります。これは、コピーコンストラクタが明示的に省略されているためです。

+0

あなたの答えをありがとう – NIGO

関連する問題