15

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 から開始

宣言 T t=e; の場合にのみ、式 e を暗黙的に型 T に変換できます。いくつかの発明された一時変数 t (8.5) に対して、整形式です。特定の言語構造では、式をブール値に変換する必要があります。そのような文脈で現れる式 e は、文脈上 bool に変換されると言われ、宣言が bool t(e); である場合にのみ整形式です。いくつかの発明された一時変数 t (8.5) に対して、整形式です。どちらの暗黙的な変換の効果も、宣言と初期化を実行し、変換の結果として一時変数を使用することと同じです。T が左辺値参照型 (8.3.2) の場合、結果は左辺値であり、それ以外の場合は右辺値です。式 e は、初期化で左辺値として使用される場合に限り、左辺値として使用されます。

その後、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 で説明した左辺値と右辺値に何らかの影響がありますか?
4

2 に答える 2

15

変換が暗黙的であることとはあまり関係がありません。さらに、コンバージョンとはあまり関係がありません。それは本当に右辺値と左辺についてです。

99typeに変換するXと、結果は右辺値になります。C++ では、変換の結果は常に右辺値です (参照型に変換しない限り)。C++ では、非 const 参照を右辺値にアタッチすることは違法です。

たとえば、このコードはコンパイルされません

X& r = X(99); // ERROR

非 const 参照を右辺値にアタッチしようとするためです。一方、このコードは問題ありません

const X& cr = X(99); // OK

右辺値に const 参照を付けてもまったく問題ないからです。

コードでも同じことが起こります。暗黙の変換が含まれているという事実は、ちょっと的外れです。暗黙的な変換を明示的な変換に置き換えることができます

implicit_conversion_func(X(99));

そして同じ状況にconstなってしまいますconst

ここでも、変換 (明示的または暗黙的) が果たす唯一の役割は、右辺値を生成するのに役立つことです。一般に、他の方法で右辺値を生成し、同じ問題に遭遇する可能性があります

int &ir = 3 + 2; // ERROR
const int &cir = 3 + 2; // OK
于 2010-10-09T04:05:29.097 に答える
0

セクション 5.2.2 パラグラフ 5 に従って、関数への引数がconst参照型の場合、必要に応じて一時変数が自動的に導入されます。あなたの例では、 の右辺値の結果をX(99)一時変数に入れる必要があるため、その変数をconst参照によって に渡すことができますimplicit_conversion_func

于 2010-10-09T04:15:03.450 に答える