Why don't static member variables play well with the ternary operator?

一世执手 提交于 2019-11-30 08:29:01

This is according to the C++ Standard. The ternary operator does constitute a single lvalue that will refer to either GOOD or BAD at runtime. The lvalue to rvalue conversion is not applied immediately to either the lvalue GOOD or BAD, and therefor you require a definition of GOOD and BAD.

See the core language issue report http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#712 .

As a workaround, you can apply explicit casts to int (which reads their values, thereby doing an lvalue to rvalue conversion) or use an operator that reads the value, like +:

localStatus = (num > 2) ? +GOOD : +BAD;
class Test {
    static const int GOOD = 0;
    static const int BAD = 1;
};

These are only declarations; they are not definitions. You need to provide definitions of the static member variables, outside of the definition of the class, in one of your .cpp files:

const int Test::GOOD;
const int Test::BAD;

Alternatively, for integer constants, it is often more convenient to use an enum:

class Test {
    enum { 
        GOOD = 0,
        BAD = 1 
    };
};

Your code looks fine to me. And ideone agrees: see this link. But that's with gcc-4.3.4. However, my gcc-4.4.0 doesn't accept it. So whatever the reason, it's not obvious.

Edited to add: The following variant compiles under gcc-4.4.0:

int localStatus = 42 ? GOOD : BAD;

Reminder: the following code doesn't compile:

int localStatus = (num == 42) ? GOOD : BAD;

So somebody has screwed up somewhere.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!