C++ 相同的方法签名但不同的返回类型

标签 c++ templates overloading

我看到了下面的代码:

template <class T>
class Type {
    public:
        Type() {}
        T& operator=(const T& rhs) {value() = rhs; return value();}
        T& value() {return m_value;}
        T value() const {return m_value;}
    private:
        T m_value;
};

为什么编译器不报错

    T& value() {return m_value;}
    T value() const {return m_value;}

以及如何知道调用了哪一个?

最佳答案

这两个函数其实是不一样的。只有第二个函数被声明为 const 成员函数。如果从中调用成员的对象是 const,则使用后一个选项。如果对象是非 const,则使用第一个选项。

例子:

void any_func(const Type *t)
{
    something = t->value(); //second `const` version used
}

void any_func2(Type *t)
{
    something = t->value(); //first non-`const` version used
}

如果两个函数都被声明为非const,或者都被声明为const,编译器(无论如何应该)提示。

关于C++ 相同的方法签名但不同的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33264017/

相关文章:

c++ - C++ 中用于不可变数组的模板函数

C++ 检查数组是否使用 'new' 创建

c++ - 链接器看不到 .lib 内的函数

c++ - GCC-Visual Studio std::thread 编译器差异

C++:指向数据成员或特征的指针?

c++ - 为什么方法重载或枚举标志定义会触发 gcc7.2 编译器警告?

c++ - 如何将包含纪元时间的十六进制字符串转换为time_t?

C++:调试 C++ 模板链接器错误

c++ - 重载多个函数的简写

c++ - 使用模板调用重载函数(unresolved overloaded function type compiler error)