[C++]暗黙の型変換

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
moba
記事: 82
登録日時: 4年前

[C++]暗黙の型変換

#1

投稿記事 by moba » 4年前

お世話になります。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) );
}

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

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

#2

投稿記事 by へにっくす » 4年前

ほお。これは確かに動いている。
ちょっと手を加えてみました。

コード:

#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)
回答になってなくてすみません。
written by へにっくす

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

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

#3

投稿記事 by tk-xleader » 4年前

型変換(Conversions) - C++11の文法と機能(C++11: Syntax and Feature)

 これによりますと、いずれもユーザー定義の型変換なので、同じ規則に従うということになります。つまり、いずれもユーザー定義の型変換が暗黙に呼び出されることを許容している場合のみ動作します。
最後に編集したユーザー tk-xleader on 2016年5月03日(火) 19:55 [ 編集 1 回目 ]

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

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

#4

投稿記事 by へにっくす » 4年前

なるほどこれね。
C++11/14/17 の機能のサポート
上記の、「明示的な変換演算子」かな?
written by へにっくす

アバター
tk-xleader
記事: 153
登録日時: 9年前
連絡を取る:

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

#5

投稿記事 by tk-xleader » 4年前

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

アバター
へにっくす
記事: 630
登録日時: 8年前
住所: 東京都

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

#6

投稿記事 by へにっくす » 4年前

細かいですねー
痒い所に手が届く、みたいな?

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

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

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

#7

投稿記事 by YuO » 4年前

うーん,1)と2)が「同じ型変換」かと言われると微妙な感じがします。
文法的には,1)は初期化なのでそもそも型変換では無いですが,2)は明示的な型変換です。
► スポイラーを表示

moba
記事: 82
登録日時: 4年前

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

#8

投稿記事 by moba » 4年前

ご回答ありがとうございました。
返信が遅れてすみませんでした。ずいぶんハードなところに迷い込んでしまったのですね…

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る