即使使用显式关键字声明了int cast运算符,也会隐式进行统一初始化。是什么原因?

问题描述 投票:2回答:1
#include <iostream>

using namespace std;

class Test
{
private:
    mutable int val{};
public:
    static constexpr int MAX{ 5 };
public:
    Test() = default;
    Test(int i) : val{ i } {}
    ~Test() { cout << "~Test()" << endl; }

    explicit operator int() const { return val; }   // int()변환 연산자 오버로딩 (반환형식을 기재하지 않는다.)

    void print() const
    {
        ++val;  // mutable 형식이기 때문에 수정가능
        cout << val << endl;
    }
};

int main()
{
    Test t{ 10 };
    int i = static_cast<int>(t);    // int()변환 연산자가 explicit이라 명시적으로 타입캐스팅을 해주어야한다.
    int j{ t };                     // 근데 얘는 왜 될까..??
}

“即使使用显式关键字声明了int cast运算符,也会隐式进行统一初始化。这是什么原因?”

c++ initialization explicit
1个回答
1
投票

[int j{ t };执行direct initialization,它考虑了explicit转换功能。

直接初始化比复制初始化更宽松:复制初始化仅考虑非显式构造函数和非显式用户定义的转换函数,而直接初始化则考虑所有构造函数和所有用户定义的转换函数。

另一方面,copy initialization仅考虑非明确的转换函数。然后int j = t;格式不正确。

根据标准,[class.conv.fct]/2

转换函数可能是显式([dcl.fct.spec]),在这种情况下它仅被视为用户定义的转换直接初始化([dcl.init])。否则,用户定义转换不限于用于作业和初始化。 [示例:

class Y { };
struct Z {
  explicit operator Y() const;
};

void h(Z z) {
  Y y1(z);          // OK: direct-initialization
  Y y2 = z;         // ill-formed: copy-initialization
  Y y3 = (Y)z;      // OK: cast notation
}

void g(X a, X b) {
  int i = (a) ? 1+a : 0;
  int j = (a&&b) ? a+b : i;
  if (a) {
  }
}

—结束示例]

© www.soinside.com 2019 - 2024. All rights reserved.