我想知道为什么下面的代码会出现错误。和类型转换运算符有关吗? [关闭]

问题描述 投票:0回答:1

我想知道为什么下面的代码会出现错误。我使用 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";
};

为什么会出现这种情况

c++ c++17 clang++
1个回答
0
投票

由于如何指定模板参数推导(请参阅:https://en.cppreference.com/w/cpp/language/template_argument_deduction#Conversion_function_templateC++ 中转换函数模板参数推导的含义),

_Ty
通常不会被推导为引用类型。

这与为什么

template<typename T> void f(T x);
T x
不会被推导为引用类型的逻辑类似。

手动调用它会得到预期的类型:

const std::string &str = std::move(a).operator const std::string&();

但除此之外,为了能够转换为引用类型,您需要有

&

© www.soinside.com 2019 - 2024. All rights reserved.