为什么模板不隐式实例化为const或引用类型?
Why do templates not implicitly instantiate to const or reference types?
考虑以下带有显式特化的函数模板。
template<typename T>
void f(T);
template<>
void f<int>(int i) { std::cout << "f() chose intn"; ++i; }
template<>
void f<const int&>(const int&) { std::cout << "f() chose const int&n"; }
第一个专门化可以隐式实例化。第二个不能,即使第一个专门化不存在。这与函数重载的规则不同,函数使用int
或const int&
可以正常工作(链接示例中使用g()
)。
具有int
专门化可用的示例。作品。
只有const int&
专门化可用的示例。编译但链接失败。
为什么模板类型演绎是这样工作的?为什么选择这样工作?另一种方法是让模板类型演绎的行为类似于函数重载。
我的理解是,对于重载函数,编译器已经知道所有可用的选项,但是对于模板,编译器必须首先决定要查找什么,然后看看它是否可以实例化。如果是这种情况,那么要求编译器搜索类型的合格变体是不合理的要求吗?
考虑没有显式特化的情况:
template <typename T>
void f(T x)
{
T y = 42 + x;
std::cout << y;
}
int main()
{
int n = 1337;
f(n);
}
模板实参演绎永远不会演绎引用类型,因为替代方法是总是演绎引用类型。如果是这样,上面对f(n)
的调用将调用f<int&>
,这将使T y = 42 + x;
成为病态的。
选择专门化发生在演绎完成后。
第一个专门化可以隐式实例化。第二个不能,即使第一个专门化不存在。
你不能让f<int>
缺席,你在这里声明:
template<typename T>
void f(T);
相关文章:
- 强制转换为引用类型
- 将const引用参数初始化为默认参数会导致悬空引用吗
- 为什么"const auto [x, y]"绑定到引用类型时没有按预期运行?
- 什么是常量指针常量引用类型的参数?(const X* const & p)
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 字符串的decltype和const引用返回类型
- 为什么当 T 是引用类型时,const T& 参数中的 const 会消失?
- 调用具有const键类型引用的std::指针集的count方法
- const*char类型中的返回值在获得值时立即被取消引用
- 为什么模板不隐式实例化为const或引用类型?
- 模板函数c++类型的非const引用的无效初始化
- 为什么const模板化引用类型不同于const引用类型?
- 错误:从类型为"int"的右值初始化类型为"int&"的非 const 引用无效
- 从类型的临时类型初始化对类型的非const引用无效
- 将非const引用使用auto-keyword声明的lambda作为实参传递给std::函数形参类型
- 来自右值类型的非const引用
- 从类型 'const char*&' 的右值初始化 'const char *' 类型的非常量引用无效
- 引用(类型 &)"non-const lvalue reference to type cannot bind"错误,但指针(类型 *)不错误
- Mat::at - error:类型的非const引用的无效初始化的包装器
- 警告:不应该用临时类型初始化非const引用