お世話になります。2点質問させてください。 1点でした
■次の2つの型変換は、全く別のものなのでしょうか。それとも、同じ規則で起こるものなのでしょうか。
1)
2)
[C++]暗黙の型変換
Re: [C++]暗黙の型変換
ほお。これは確かに動いている。
ちょっと手を加えてみました。
Visual Studio 2015 Community 開発者コマンドプロンプトで実行
おそらく以下のヘルプに載っているボクシングの機能だと思うのですが、別にCLIじゃないですよね・・・
ボックス化 (C++/CLI)
回答になってなくてすみません。
ちょっと手を加えてみました。
#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;
}
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>
ボックス化 (C++/CLI)
回答になってなくてすみません。
written by へにっくす
- tk-xleader
- 記事: 158
- 登録日時: 13年前
- 連絡を取る:
Re: [C++]暗黙の型変換
型変換(Conversions) - C++11の文法と機能(C++11: Syntax and Feature)
これによりますと、いずれもユーザー定義の型変換なので、同じ規則に従うということになります。つまり、いずれもユーザー定義の型変換が暗黙に呼び出されることを許容している場合のみ動作します。
これによりますと、いずれもユーザー定義の型変換なので、同じ規則に従うということになります。つまり、いずれもユーザー定義の型変換が暗黙に呼び出されることを許容している場合のみ動作します。
最後に編集したユーザー tk-xleader on 2016年5月03日(火) 19:55 [ 編集 1 回目 ]
- tk-xleader
- 記事: 158
- 登録日時: 13年前
- 連絡を取る:
Re: [C++]暗黙の型変換
「明示的な変換演算子」は、explicitコンストラクタに対応する変換演算子(explicit operator T())なので、ここで問題になっているものとはちょっと違います。explicitが付与された変換演算子は、明示的な型変換でのみ呼び出すことができます。ただし、bool型への変換については、特定の文脈では暗黙に呼び出されることになっています(bool型へのexplicitユーザ定義変換 - yohhoyの日記)。
他方で、質問者様のコードはC++03でも通ります。それは、explicitのついていない引数1個のコンストラクタが暗黙のユーザー定義の型変換に使われるという規則があるからなんですね。これはC++03でも同様でした。
Re: [C++]暗黙の型変換
細かいですねー
痒い所に手が届く、みたいな?
C++03でも通るってことは
今回はC++03の機能ってこと?
よくわからなくなってきた。
まあいずれにしろ質問の回答としては同じ規則でってことでいいよね。
痒い所に手が届く、みたいな?
C++03でも通るってことは
今回はC++03の機能ってこと?
よくわからなくなってきた。
まあいずれにしろ質問の回答としては同じ規則でってことでいいよね。
written by へにっくす
Re: [C++]暗黙の型変換
うーん,1)と2)が「同じ型変換」かと言われると微妙な感じがします。
文法的には,1)は初期化なのでそもそも型変換では無いですが,2)は明示的な型変換です。
文法的には,1)は初期化なのでそもそも型変換では無いですが,2)は明示的な型変換です。
► スポイラーを表示
Re: [C++]暗黙の型変換
ご回答ありがとうございました。
返信が遅れてすみませんでした。ずいぶんハードなところに迷い込んでしまったのですね…
精確ではないかもしれませんが、
"型を入力する部分で値を入力した場合、その値を引数に取る型のコンストラクタに変換される"
のように理解しておこうと思います。
例の1と2が『同じ型変換』ものかはともかく、同じ規則で理解できそうなので、
これで解決としました。ありがとうございました_(._.)_!
返信が遅れてすみませんでした。ずいぶんハードなところに迷い込んでしまったのですね…
精確ではないかもしれませんが、
"型を入力する部分で値を入力した場合、その値を引数に取る型のコンストラクタに変換される"
のように理解しておこうと思います。
例の1と2が『同じ型変換』ものかはともかく、同じ規則で理解できそうなので、
これで解決としました。ありがとうございました_(._.)_!