为什么在模板参数中不 const A 并绑定到 A()?
Why doesn't const A & bind to A() in template arguments?
我试图做这个模板实例化,但它不工作。我得到错误:
prog.cpp:7:15: error: template-id 'f<const A&, A()>' for 'void f()' does not match any template declaration
template <class T, T> void f() {}
struct A {};
template void f<const A &, A()>();
int main() {}
这很奇怪,因为当我在main中这样做时,它可以工作:
int main() {
const A &a = A(); // no error
}
为什么它不能在模板行中工作呢?
非类型模板参数可能重复
这些是模板非类型形参的规则
非类型模板参数必须是以下类型之一(可选的cv限定):
- 整型或枚举型,
- 指向对象或指向函数的指针,
- 左值指向对象或左值指向函数
- 指针指向成员,
std::nullptr_t
.
传递的是一个RValue(不能赋值的临时对象等),它不属于上述任何一种可能性。
编辑:
看起来它实际上被解释为函数类型,但是您的模板签名期望类型为A
(恰好是const A&
)的非类型参数
模板实参不能是临时对象。只有可以合理地比较精确相等的基本类型才能作为模板非类型参数。这包括
- 整数,
- 计数器,
- 指向具有
extern
链接的对象。
,
- 不允许使用浮点数,因为它们可能非常接近但不等于
-
static
对象可能具有相同的名称,但在不同的文件中有不同的位置,这将使template-id混淆地解析到不同文件中具有相同名称的不同实例化 - 同样适用于字符串字面值
- 临时对象没有一致的地址,所以你不能传递指向一个 的指针
- 传递的临时对象的值,甚至不能测试是否相等,永远不会让语言将一个模板实例与另一个模板实例匹配!
(正如Pubby所指出的,A()
实际上被解释为没有参数返回A
的函数类型。因此,编译器只是没有找到包含两个类型参数的模板声明。)
相关文章:
- 在其他容器中使用 boost::container::static_vector 时,GCC 编译错误"将'const s'绑定到类型's&'的引用丢弃限定符"
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 错误:对类型 'const ItemInstance' 的引用无法绑定到类型 'void' 的右值
- 为什么"const auto [x, y]"绑定到引用类型时没有按预期运行?
- 为什么静态常量字符 * const 变量在为左值时可绑定到右值引用参数
- 对类型"项 *const"的引用无法绑定到类型为"const 项 *"的右值
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 为什么我的运算符=(T&&)模板只绑定到一个const&而不是一个&&?
- 错误:将"const double"绑定到类型为"double&"的引用会丢弃限定符
- 我应该始终使用"T&&"而不是"const T&"或"T&"来绑定到回调函数吗?
- 当int的值明确更改时,为什么引用对const int(绑定到int)的值会更改
- C++17:是编译器为(静态存储持续时间)const引用绑定创建的可修改的临时对象(和存储)
- std::clamp - 检测函数返回值是否绑定到 const T&
- 结构化绑定中的const引用扩展了分解对象的寿命
- C++ const&绑定到临时对象
- 为什么从三元文字中绑定到const引用副本
- 为什么 const 数组优先绑定到 const T& 参数而不是 T&& 参数?
- 通过将返回值绑定到const引用,C++性能得到改善
- 为什么不能将"const char*"的左值绑定到"const char* const&&?
- 构造函数中的 const int 引用是否可以安全地绑定到文本