なぜ暗黙の変換のためにconst?
-
29-09-2019 - |
質問
大規模な読書の後 ISO/IEC 14882、プログラミング言語 - C ++ 私はまだ理由がわかりません const
次のような単一の引数コンストラクターを使用して、ユーザー定義のタイプへの暗黙的な変換に必要です
#include <iostream>
class X {
public:
X( int value ) {
printf("constructor initialized with %i",value);
}
}
void implicit_conversion_func( const X& value ) {
//produces "constructor initialized with 99"
}
int main (int argc, char * const argv[]) {
implicit_conversion_func(99);
}
セクション4行3から始めます
式eは、宣言t t = eの場合にのみ、タイプtに暗黙的に変換できます。いくつかの発明された一時変数t(8.5)の場合、よく形成されています。特定の言語構成では、式をブール値に変換する必要があります。このようなコンテキストで表示される式Eは、文脈的にブールに変換されると言われ、宣言ブールt(e)の場合にのみよく形成されます。いくつかの発明された一時変数t(8.5)の場合、よく形成されています。暗黙の変換の効果は、宣言と初期化を実行し、変換の結果として一時変数を使用することと同じです。結果は、tがLValue参照タイプ(8.3.2)である場合、LValueと、それ以外の場合はRValueです。式eは、初期化がそれをlvalueとして使用する場合にのみ、lvalueとして使用されます。
それに続いて、8.5行6のユーザー定義タイプに関連する初期化装置のセクションを見つけました
プログラムがconst認定タイプtのオブジェクトのデフォルトの初期化を要求する場合、tはユーザーが提供するデフォルトコンストラクターを持つクラスタイプになります。
最後に、私は12.3ライン2で、ユーザー定義の変換について述べています。
ユーザー定義の変換は、それらが明確な場合にのみ適用されます(10.2、12.3.2)。
言うまでもなく、10.2と12.3.2は私の質問に答えませんでした。
- 誰かがどのような効果に光を当てることができますか
const
暗黙的な変換にありますか? - の使用はありますか
const
12.3行2回あたりの変換を「明確」にしますか? - します
const
どういうわけか、セクション4で語られたlvalue対rvalueに影響しますか?
解決
変換の存在とはあまり関係ありません 暗黙. 。さらに、それは本当に関係がありません 変換. 。それは本当にです rvalues vs。 lvalues.
変換するとき 99
入力し X
, 、結果は次のとおりです rvalue. 。 C ++では、変換の結果は常にrvaluesです(参照タイプに変換しない限り)。 C ++では、rvaluesに非const参照を添付することは違法です。
たとえば、このコードはコンパイルされません
X& r = X(99); // ERROR
非コンスト参照をRValueに添付しようとしているためです。一方、このコードは問題ありません
const X& cr = X(99); // OK
const参照をrvalueに添付してもまったく問題ないためです。
コードでも同じことが起こります。暗黙の変換を伴うという事実は、ポイントの横にあります。暗黙の変換を明示的な変換に置き換えることができます
implicit_conversion_func(X(99));
そして、同じ状況になります const
なしでコンパイルします const
そうではありません。
繰り返しますが、ここで変換(明示的または暗黙的)が果たす唯一の役割は、RValueを生成するのに役立つということです。一般に、他の方法でRValueを作成して、同じ問題に遭遇することができます
int &ir = 3 + 2; // ERROR
const int &cir = 3 + 2; // OK
他のヒント
セクション5.2.2パラグラフ5に従って、関数への引数が const
参照タイプ、必要に応じて一時変数が自動的に導入されます。あなたの例では、のrvalueの結果 X(99)
その変数を通過できるように、一時的な変数に入れなければなりません const
への参照 implicit_conversion_func
.