質問

大規模な読書の後 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は私の質問に答えませんでした。

  1. 誰かがどのような効果に光を当てることができますか const 暗黙的な変換にありますか?
  2. の使用はありますか const 12.3行2回あたりの変換を「明確」にしますか?
  3. します 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.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top