c++ - 奇怪的 C++ 模板和常量问题

标签 c++ templates

我不明白为什么这个程序的输出是第二种方法而不是第一种方法...

#include <iostream>

template <class T>
void assign(T& t1,T& t2){
    std::cout << "First method"<< std::endl;
}

template <class T>
void assign(T& t1,const T& t2) {
    std::cout << "Second method"<< std::endl;
}

class A
{
public:
    A(int a):_a(a){};
private:
    int _a;
    friend A operator+(const A& l, const A& r);
};

A operator+(const A& l, const A& r) {
friend A operator+(const A& l, const A& r);return A(l._a+r._a);
}

int main ()
{
    A a=1;
    const A b=2;
    assign(a,a+b);
}

但是,当我将我的主要功能更改为:

int main ()
{
    A a=1;
    const A b=2;
    A c=a+b;
    assign(a,c);
}

输出是第一种方法。 有什么想法吗?

最佳答案

assign( a, a+b );

a + b 的结果是 A 类型的右值表达式创建一个临时的,你不能将它绑定(bind)到一个非常量引用,所以它会选择 const重载,因为您可以将 const 引用绑定(bind)到临时对象。

assign( a, c );

在这种情况下,子表达式 c是一个左值表达式,您可以绑定(bind)一个非常量引用。在这种情况下,因为非常量版本与 T=A 完美匹配它优于 const 重载,后者需要在第二个参数中从 A 类型的 左值进行转换A 类型的常量左值.

关于c++ - 奇怪的 C++ 模板和常量问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7441440/

相关文章:

c++函数解析选择模板化版本而不是普通函数

c++ - 破坏和复制构造的算法

c++ - 避免在多个 C++ 模板特化上重复代码

c++ - 使用 atlbase.h 是否会使我编译的应用程序具有一些额外的依赖性?

c++ - 前向声明导致头文件出现问题

c++ - 不同机器上的RSA加解密

c++ - SFINAE 无法有条件地编译成员函数模板

c++ - 模板:用类类型的成员实例化一个对象

c++ - 在 gdb 中设置一个文件范围的断点

c++ - 将源代码添加到elf文件