c++ - 模板默认参数丢失其引用类型

标签 c++ templates function-templates template-argument-deduction

考虑

#include <iostream>
#include <type_traits>

template <class T, class ARG_T = T&>
T foo(ARG_T v){
    return std::is_reference<decltype(v)>::value;
}

int main() {
    int a = 1;
    std::cout << foo<int>(a) << '\n';
    std::cout << foo<int, int&>(a) << '\n';
}

我希望这两种情况下的输出都是 1。但在第一种情况下,它是 0:与默认值 class ARG_T = T 而不是 class ARG_T = T& 一致。

我错过了什么?

最佳答案

对于foo<int>(a) , ARG_T是从 a 推导出来的,并且不是从默认模板参数中获取的。因为它是一个按值函数参数,并且 aint 类型的表达式,推导为int .

一般来说,当模板实参推导可以发现实参是什么时,不使用默认模板实参。

但是我们可以通过为函数参数引入非推导上下文来强制使用默认参数。例如:

template <class T, class ARG_T = T&>
T foo(std::enable_if_t<true, ARG_T> v1){
    //...
}

或者 C++20 type_identity实用程序,如其他答案所示。

关于c++ - 模板默认参数丢失其引用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57820195/

相关文章:

c++ - 用mysql原生函数进行字节序转换

c++ - 实现可变类型特征

C++ "value++"会导致警告但 "value+1"不会?

c++ - 使用非参数模板参数调用 lambda

c++ - 为什么不能从 std::addressof<int> 解析模板参数?

c++ - 在命名空间 std 中重载函数模板

c++ - qt 和 libbluedevil : No Such slot

c++ - 模板模板参数和 clang

c++ - (SFINAEd) 模板函数的宏

c++ - 如何在 C++ 的模板函数中传递普通参数和模板参数?