【问题标题】:static_cast Conversion constructor vs Conversion operator [duplicate]static_cast 转换构造函数与转换运算符 [重复]
【发布时间】:2016-05-03 20:13:14
【问题描述】:

阅读this后,我尝试使用static_cast进行这样的转换:

class A;

class B { 
      public: 
         B(){} 

         B(const A&) //conversion constructor
         { 
              cout << "called B's conversion constructor" << endl; 
         } 
};

class A { 
      public: 
         operator B() const //conversion operator
         { 
              cout << "called A's conversion operator" << endl; 
              return B(); 
         } 
};

int main()
{
    A a;

    //Original code, This is ambiguous, 
    //because both operator and constructor have same cv qualification (use -pedantic flag)
    B b = a;

    //Why isn't this ambiguous, Why is conversion constructor called, 
    //if both constructor and  operator have same c-v qualification
    B c = static_cast<B>(a); 
    return 0;
}

我预计它不会编译,因为构造函数和运算符具有相同的 c-v 资格。但是它编译成功并且static_cast 调用构造函数而不是运算符。为什么?

(使用带有pedanticWall 标志的gcc 4.8.1 编译)

【问题讨论】:

    标签: c++ gcc casting static-cast


    【解决方案1】:

    C++11 标准说(强调我的):

    5.2.9 静态转换

    4 否则,表达式 e 可以使用 static_cast 形式的 static_cast&lt;T&gt;(e) 显式转换为类型 T 如果声明 T t(e); 格式正确,对于一些发明的临时变量t (8.5)。这种显式转换的效果与执行声明和初始化,然后使用临时变量作为转换的结果相同。表达式e 当且仅当初始化将其用作glvalue 时才用作glvalue。

    5 否则,static_cast 将执行下列转换之一。不得使用static_cast 显式执行其他转换。

    这就解释了为什么static_cast

    B c = static_cast<B>(a); 
    

    最终调用B的构造函数。

    仅当T t(e) 格式不正确时才使用转换运算符。

    【讨论】:

    • 我明白这句话的意思是如果B temporary(a)是有效的static_cast可以执行,但我不明白为什么构造函数优先。
    • @PcAF,我找不到说static_cast 可以使用转换运算符执行的子句。但是,如果有,则其优先级低于上述。
    • @R Sahu 删除 B(const A&amp;) 转换构造函数,现在 static_cast 与转换运算符一起使用。
    • @PcAF,转换运算符的优先级较低。查看更新的答案。
    • @R Sahu 您的回答是有道理且正确的。您对此有标准参考吗?因为在您突出显示的句子中,我看不到任何关于优先级的内容。
    猜你喜欢
    • 2010-11-25
    • 2011-01-27
    • 2012-09-02
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    相关资源
    最近更新 更多