gpt4 book ai didi

c++ - 静态转换 : Conversion function templates - are they really working?

转载 作者:行者123 更新时间:2023-12-02 02:53:20 25 4
gpt4 key购买 nike

据我所知static_cast以下代码应该可以工作:

#include <iostream>
#include <string>

class ConvSample
{
public:
template<typename T>
constexpr operator T(){
return {};
}
};

int main()
{
ConvSample aInst;

int i = aInst;
std::cout << i << "\n";

std::string str = static_cast<std::string>(aInst);
std::cout << str << "\n";

return 0;
}

它与 Clang 等一些编译器完美配合。但例如MSVC 或 ICC 则不然。

参见Compiler Explorer

总的来说,他们提示由 std::string 提供的不能真正工作的构造函数引起的一些歧义。

此外,如果我在 gcc 上打开 Wconversion,我会遇到段错误?!

代码有问题吗?这些错误只是编译器错误吗?如果我将代码更改为不使用模板,它会很好地工作: Compiler Explorer

最佳答案

不幸的是,该标准在这里含糊不清([expr.static.cast]/4,引用省略):

An expression e can be explicitly converted to a type T if there is an implicit conversion sequence from e to T, or if overload resolution for a direct-initialization of an object or reference of type T from e would find at least one viable function. […] [T]he result object is direct-initialized from e. […]

这两个启用条件都成立:存在一个隐式转换序列(由所需的转换函数调用组成),并且存在多个用于直接初始化的可行函数(因为还存在各种单个参数的隐式转换序列)对于 std::string 构造函数)。

但是,这只是隐式转换序列的复制初始化,它拒绝将 ConvSample 转换为(例如)const char*,然后转换为 std::string,它提供了一种生成 std::string明确方法:它专门寻找目标类型的转换函数,同时它允许转换为(比如说)const std::string&,常见的实现不会将其解释为意味着转换函数模板也应该为该类型实例化并变得不明确.

最终调用的直接初始化在 std::string 的 5 个单参数构造函数中是不明确的(6 个用于 std::string_view 类类型) ): ConvSample 当然可以以相同的“成本”转换为其中任何一个的参数类型。

接受这一点的编译器正在应用复制初始化规则(但仍然允许显式转换)。那些拒绝它的人正在应用直接初始化,我相信这是目前的措辞所要求的。对隐式转换序列的引用仅在 C++17 中引入 CWG242 ,并且显然该领域的实现分歧仍然存在。

关于c++ - 静态转换 : Conversion function templates - are they really working?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58512607/

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