gpt4 book ai didi

C++ 可变参数模板和隐式转换

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:42:44 24 4
gpt4 key购买 nike

我正在尝试弄清楚当可变参数模板构造函数和转换运算符存在时,C++ 编译器如何解析隐式转换。这是一个最小的例子来说明:

当我写的时候:

#include <iostream>

class A {
public:
A () {}

template<typename...tTypes> A (tTypes...pArgs) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};

class B {
public:
operator A () const {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return A();
}
};

int main() {
B b;
A a = b;
}

运行时我得到这个输出:B::operator A() const .所以它正在使用转换运算符(如我所料)。在线示例 http://ideone.com/ZZ2uBz

但是当A是一个模板结果是不同的:

#include <iostream>

template<typename tType>
class A {
public:
A () {}

template<typename...tTypes> A (tTypes...pArgs) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};

class B {
public:
template<typename tType>
operator A<tType> () const {
std::cout << __PRETTY_FUNCTION__ << std::endl;
return A<tType>();
}
};

int main() {
B b;
A<float> a = b;
}

当运行这个程序时,我得到这个输出:A<tType>::A(tTypes ...) [with tTypes = {B}; tType = float] .所以它使用了 A 的可变参数构造函数而不是 B 中的转换运算符.在线示例 http://ideone.com/u9Rxuh

有人可以向我解释为什么不同吗?转换运算符不应该优先于构造函数吗?

我知道我可以显式调用转换运算符 ( A<float> a = b.operator A<float>(); ),但这不是我想要的。

最佳答案

在我看来,转换是不明确的,其他编译器按预期失败(或者至少,这是我的预期)。以使用 clang 的结果为例.

为了消除歧义,您可以显式构造函数或转换运算符。
例如,使用这个:

template<typename tType>
class A {
public:
A () {}

template<typename...tTypes> explicit A (tTypes...pArgs) { /* ... */ }
};

或者这个:

class B {
public:
template<typename tType>
explicit operator A<tType> () const { return A<tType>(); }
};

关于C++ 可变参数模板和隐式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42576878/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com