【发布时间】:2018-10-29 02:23:01
【问题描述】:
所以我有这个代码:
struct Foo {
Foo() { cout << "default\n"; }
Foo(const long long) { cout << "implicit\n"; }
};
struct Bar {
Bar(const short param) : param(param) {}
operator long long() const { return static_cast<long long>(param); }
const short param;
};
我原以为Foo foo = Bar(13) 会使用我的隐式强制转换,然后使用转换构造函数。 But it errors:
错误:从
Bar转换为非标量类型Foo请求
这很好用:Foo foo(Bar(13))。为什么我的隐式转换用于显式转换构造,而不用于隐式转换构造?
我从https://en.cppreference.com/w/cpp/language/copy_initialization得到的规则说:
转换的结果,如果使用转换构造函数,则为纯右值表达式,然后用于直接初始化对象
【问题讨论】:
-
不存在“隐式强制转换”之类的东西。强制转换是一种显式转换。
-
是否可以将转换构造函数和强制转换运算符都视为隐式转换?我想区分。
-
没关系,因为无论哪种方式都没有“隐式强制转换”之类的东西,但您已经使用了 3 次这个词。
-
@LightnessRacesinOrbit 隐式转换会被认为是正确的吗?
-
如果这就是你的意思。我不知道,因为你使用了一个不存在的术语!
标签: c++ constructor implicit-conversion typecast-operator explicit-conversion