ここで列挙型変数が右辺値になるのはなぜですか?


12

例:

typedef enum Color
{
    RED,
    GREEN,
    BLUE
} Color;

void func(unsigned int& num)
{
    num++;
}

int main()
{
    Color clr = RED;
    func(clr);
    return 0;
}

これをコンパイルすると、次のエラーが発生します。

<source>: In function 'int main()':

<source>:16:9: error: cannot bind non-const lvalue reference of type 'unsigned int&' to an rvalue of type 'unsigned int'

     func(clr);

         ^~~

私がclr渡す変数()func(unsigned int&)は左辺値だと思います。のアドレスを取得して、clr別の値を割り当てることができます。渡そうとすると、なぜ右辺値に変わるのfunc(unsigned int&)ですか?


5
自問してください:ですenumaはunsigned int
NathanOliver

@ NathanOliver-ReinstateMonica私の元の意見では、私typedef enumはネイティブ型ではないと思います。C++はそれをunsigned int実際に型として扱います。
公園

1
この場合、GCCのエラーメッセージは最適ではありません。Clangは、元のタイプのを出力することで、混乱を抑えたメッセージを表示しますclr
cpplearner

@cpplearnerうん、そういうわけで私enum typeunsigned intC ++のように扱うと思った。
公園

enum Xとは異なる独自のタイプですint
MM

回答:


22

clrそれ自体は型の左辺値ですColor。ただし、関数はを受け入れませんColor。(参照)を受け入れますunsigned int。したがって、引数は(暗黙的に)変換されます。そして、変換の結果はtypeのprvalueですunsigned int


1
ええ、私func(Color&)は質問する前に試してみて、それはコンパイルパスです。C ++はコンパイル時にenum型を型として扱うと思っunsigned intていました。ご回答有難うございます。
公園

混乱を助長することの1つは、CがC ++のほぼ完全なサブセットであることです。少なくとも、Cでできることは何でも、特にgcc / clangで、ほとんど同じコードでC ++で行うことができます。また、gccによって提供されるCの「制限」のC ++の置き換えとして、コンパイラー依存の構成体が必要になります。列挙型はCとC ++で異なります。たとえば、someColorが列挙型の場合、 'someColor = 1'は有効なCですが、C ++ではありません。
ErikAlapää

0

列挙型initおよび代入は内部で列挙型でなければならないため、列挙型はlvalueにはできません。void func(unsigned int&num)この関数は引用型が必要です


に変更func(unsigned int&)するとfunc(Color&)、コンパイラはそれを受け入れます。ですから、列挙型の変数は左辺値だと思います。
公園

いいえ、列挙型はint enumの定義を外部で割り当てることができないため
スーパーマン

それでもまだ価値観ですか?しかし、私はそれに非const lvalue参照をバインドしますfunc(Color&)て渡します。
公園

はい、それでも右辺値、func(Color&key)この関数のパラメーターキーはRED、GREEN、BLUEにのみ割り当てられます。それ以外の場合はエラーになります。
スーパーマン

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.