我想知道为什么下面的代码会出现错误。我使用 clang-17 进行编译。使用 gcc11.4.0 编译此代码也会导致错误消息 我猜应该和类型转换运算符有关,但具体原因我无法确定。
class A
{
public:
template <class _Ty>
explicit operator _Ty() const noexcept
{
return c;
}
std::string c = "sdafasd";
};
int main()
{
A a;
const std::string &str = static_cast<const std::string &>(std::move(a));
}
我将代码改为如下,这样就不会出现错误了:
class A
{
public:
template <class _Ty>
explicit operator _Ty&() const noexcept
{
return c;
}
std::string c = "sdafasd";
};
为什么会出现这种情况
由于如何指定模板参数推导(请参阅:https://en.cppreference.com/w/cpp/language/template_argument_deduction#Conversion_function_template,C++ 中转换函数模板参数推导的含义),
_Ty
通常不会被推导为引用类型。
这与为什么
template<typename T> void f(T x);
,T x
不会被推导为引用类型的逻辑类似。
手动调用它会得到预期的类型:
const std::string &str = std::move(a).operator const std::string&();
但除此之外,为了能够转换为引用类型,您需要有
&
。