#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运算符,也会隐式进行统一初始化。这是什么原因?”
[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) { } }
—结束示例]