if-else和三元运算符的不同行为

时间:2014-06-10 00:06:09

标签: c++ visual-studio-2010 visual-c++ copy-constructor ternary-operator

我在VS2010-SP1中有下面的类,三元运算符和if-else似乎对getname方法下面的代码有不同的工作

template <int size=120> class StringBuf{
    public:
        StringBuf(const char* src){
            strcpy(s,src);
        }
        // Copy from another StringBuf
        StringBuf(const StringBuf& src){
            strcpy(s,src.get());
        }
        // String access
        operator const char*() const    {return get();}
        const char* get() const { return s ; }
    private:
        char    s[size];
    };

class MyPony{
    StringBuf<10> name;
    public:
        MyPony(char* name_) : name(name_){}
        const char* getname(bool bVal){
            //if( bVal )
            //  return name;
            //else
            //  return "Jimmy";
            return  (bVal==true) ? name : "Jimmy";
        }
};

int main(){
    MyPony pony("Pani");
    const char* getname = pony.getname(true);
    return 0;
}

如果我使用三元运算符,getname()方法通过调用复制构造函数生成名称的副本,然后在临时副本上调用运算符const char *。

如果我将三元运算符更改为if-else,则代码只调用运算符const char *而不进行临时副本。

我的理解是,如果else和三元运算符应该表现相同,但为什么这个类的行为不同?有什么东西我可以忽略吗?

对于三元运算符VS2005似乎直接调用运算符const char *。

1 个答案:

答案 0 :(得分:2)

当然:条件表达式a ? b : c的类型是bc的常见类型,在您的情况下为StringBuf<10>。因此,在将结果值考虑为return之前,必须首先将操作数转换为该类型。

条件表达式是表达式if语句是语句。对于不同的目的,它们是不同的东西。在您的情况下使用if语句。


您可能想知道为什么常见类型是StringBuf<10>而不是char const *。这是因为C ++ 11 5.16 / 3(“条件运算符”),它表示考虑隐式转换。在您的情况下,存在从char const [6]"Jimmy"的类型)到StringBuf<10>的隐式转换,但不是相反的方式,因此公共类型是唯一定义的。为了进行比较,如果您尝试x ? name : static_cast<char const *>("Jimmy"),则无法编译。