相关疑难解决方法(0)

是否可以通过列表初始化来调用用户定义的转换函数?

这个程序合法吗?

struct X { X(const X &); };
struct Y { operator X() const; };

int main() {
  X{Y{}};   // ?? error
}
Run Code Online (Sandbox Code Playgroud)

n2672之后,经过缺陷978的修正,13.3.3.1 [over.best.ics]具有:

4 - 但是,当初始化列表只有一个元素并且转换为某个类X时,在考虑构造函数或用户定义的转换函数的参数时,它是13.3.1.7 [...]的候选者.或者引用(可能是cv-qualified)X被认为是X [...]的构造函数的第一个参数,只考虑标准转换序列和省略号转换序列.

这看起来很不正常; 它的结果是使用列表初始化强制转换指定转换是非法的:

void f(X);
f(Y{});     // OK
f(X{Y{}});  // ?? error
Run Code Online (Sandbox Code Playgroud)

据我所知n2640,列表初始化应该能够替换直接初始化和复制初始化的所有用法,但是似乎没有办法只使用list-initialization X从类型的对象构造一个类型的对象Y:

X x1(Y{});  // OK
X x2 = Y{}; // OK
X x3{Y{}};  // ?? error
Run Code Online (Sandbox Code Playgroud)

这是标准的实际意图吗?如果没有,它应该如何阅读或阅读?

c++ implicit-conversion c++11 list-initialization

6
推荐指数
2
解决办法
555
查看次数