【发布时间】:2020-02-19 02:18:24
【问题描述】:
据我阅读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 没有。
一般来说,他们抱怨 std::string 提供的构造函数不能真正工作所导致的一些歧义。
此外,如果我在 gcc 上打开 Wconversion,我会遇到分段错误?!
代码有问题吗?这些错误只是编译器错误吗? 如果我将代码更改为不使用模板,它会很好地工作: Compiler Explorer
【问题讨论】:
-
仅供参考,全部使用
static_cast<const basic_string&>编译,这与构造函数 (7) 完全匹配:en.cppreference.com/w/cpp/string/basic_string/basic_string -
@RichardCritten:但这会涉及在转换函数中使用对临时对象的引用时未定义的行为。
-
在您提到的情况下,它被隐式转换为std :: string。在这个隐式转换之后,会调用复制构造函数......但这显然不是我想要的。它应该只调用转换运算符(它可以在没有 static_cast 或 c 样式转换的情况下工作)。
标签: c++ visual-c++ c++14 c++17