ページ 11

[C++]暗黙の型変換

Posted: 2016年5月02日(月) 22:54
by moba
お世話になります。2点質問させてください。 1点でした

■次の2つの型変換は、全く別のものなのでしょうか。それとも、同じ規則で起こるものなのでしょうか。

1)

コード:

class T {
	T(int);
}
// このとき
// T obj = 10; ⇔ T obj(10);
2)

コード:

class A{
public:
	A( int );
};
class B{
public:
	B( const A& );
};
void func(){
	// どうしてこれは動くのでしょうか
	B( 3 ); // ⇔ B( A(3) );
}

Re: [C++]暗黙の型変換

Posted: 2016年5月03日(火) 07:50
by へにっくす
ほお。これは確かに動いている。
ちょっと手を加えてみました。

コード:

#include <iostream>

using namespace std;

class A{
    int _a = 0;
public:
    A(A *ca) {
        _a = ca->get();
    }
    A( int a ) {
        _a = a;
    }
    int get() {return _a;}
};
class B{
    A a;
public:
    B( const A &ca ) : a(ca) {};
    void Print() {cout << a.get() << endl;};
};

void main(){
    // どうしてこれは動くのでしょうか
    B* b = new B( 3 ); // ⇔ B( A(3) );
    b->Print();
    delete b;
}
Visual Studio 2015 Community 開発者コマンドプロンプトで実行

コード:

C:\Users\guest\Documents>cl /EHsc 1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.23918 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

1.cpp
Microsoft (R) Incremental Linker Version 14.00.23918.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:1.exe
1.obj

C:\Users\guest\Documents>1
3

C:\Users\guest\Documents>
おそらく以下のヘルプに載っているボクシングの機能だと思うのですが、別にCLIじゃないですよね・・・
ボックス化 (C++/CLI)
回答になってなくてすみません。

Re: [C++]暗黙の型変換

Posted: 2016年5月03日(火) 09:58
by tk-xleader
型変換(Conversions) - C++11の文法と機能(C++11: Syntax and Feature)

 これによりますと、いずれもユーザー定義の型変換なので、同じ規則に従うということになります。つまり、いずれもユーザー定義の型変換が暗黙に呼び出されることを許容している場合のみ動作します。

Re: [C++]暗黙の型変換

Posted: 2016年5月03日(火) 19:39
by へにっくす
なるほどこれね。
C++11/14/17 の機能のサポート
上記の、「明示的な変換演算子」かな?

Re: [C++]暗黙の型変換

Posted: 2016年5月03日(火) 20:16
by tk-xleader
へにっくす さんが書きました:なるほどこれね。
C++11/14/17 の機能のサポート
上記の、「明示的な変換演算子」かな?
 「明示的な変換演算子」は、explicitコンストラクタに対応する変換演算子(explicit operator T())なので、ここで問題になっているものとはちょっと違います。explicitが付与された変換演算子は、明示的な型変換でのみ呼び出すことができます。ただし、bool型への変換については、特定の文脈では暗黙に呼び出されることになっています(bool型へのexplicitユーザ定義変換 - yohhoyの日記)。
 他方で、質問者様のコードはC++03でも通ります。それは、explicitのついていない引数1個のコンストラクタが暗黙のユーザー定義の型変換に使われるという規則があるからなんですね。これはC++03でも同様でした。

Re: [C++]暗黙の型変換

Posted: 2016年5月04日(水) 07:31
by へにっくす
細かいですねー
痒い所に手が届く、みたいな?

C++03でも通るってことは
今回はC++03の機能ってこと?
よくわからなくなってきた。
まあいずれにしろ質問の回答としては同じ規則でってことでいいよね。

Re: [C++]暗黙の型変換

Posted: 2016年5月04日(水) 17:30
by YuO
うーん,1)と2)が「同じ型変換」かと言われると微妙な感じがします。
文法的には,1)は初期化なのでそもそも型変換では無いですが,2)は明示的な型変換です。
► スポイラーを表示

Re: [C++]暗黙の型変換

Posted: 2016年5月05日(木) 14:01
by moba
ご回答ありがとうございました。
返信が遅れてすみませんでした。ずいぶんハードなところに迷い込んでしまったのですね…

精確ではないかもしれませんが、
"型を入力する部分で値を入力した場合、その値を引数に取る型のコンストラクタに変換される"
のように理解しておこうと思います。

例の1と2が『同じ型変換』ものかはともかく、同じ規則で理解できそうなので、
これで解決としました。ありがとうございました_(._.)_!