3

今日初めてこのようなキャストを見たのですが、なぜこれが機能するのか興味があります. この方法でキャストすると、クラスメンバーではなく、一時的に割り当てられると思いました。VC2010を使用。

class A
{
public:

   A() :
      m_value(1.f)
   {
      ((float)m_value) = 10.f;
   }

   const float m_value;
};
4

2 に答える 2

4

コードをコンパイルするために他のすべての問題を修正した後でも、非標準の拡張機能を使用しているため、VC2010 でのみ機能します。そして/Wall、すべての警告を表示するように指定すると、コンパイラは出力します

警告 C4213: 非標準の拡張子が使用されました: 左辺値にキャスト

于 2013-03-11T16:30:07.320 に答える
3

うまくいかないはずです。キャスト表記による明示的な型変換floatは prvalue になります (§5.4):

(T) 式cast-expressionの結果の型はTです。T が左辺値参照型または関数型への右辺値参照である場合、結果は左辺値であり、T がオブジェクト型への右辺値参照である場合、結果は xvalue です。それ以外の場合、結果は prvalueです。

私の強調が追加されました。

代入演算子は、その左オペランドとして左辺値を必要とします (§5.17):

すべてが左オペランドとして変更可能な左辺値を必要とし、左オペランドを参照する左辺値を返します。

prvalue は左辺値ではありません。

于 2013-03-11T16:17:31.973 に答える