gpt4 book ai didi

c++ - 从右值参数推导出对 const 的引用

转载 作者:可可西里 更新时间:2023-11-01 16:05:51 25 4
gpt4 key购买 nike

好吧,这可能看起来像一个愚蠢的问题,但它是这样的:

template <typename T>
void foo(T& x)
{
}

int main()
{
foo(42);
// error in passing argument 1 of 'void foo(T&) [with T = int]'
}

是什么阻止 C++ 使用 T = const int 实例化 foo 函数模板?

最佳答案

问题在于模板类型推导必须计算出精确匹配,并且在那种特定情况下,由于签名中的引用,精确匹配需要一个左值。值 42 不是左值,而是右值,解析 Tconst int不会产生完美的匹配。由于模板类型推导仅限于完全匹配,因此不允许推导。

如果不使用文字而是使用非可变左值,那么编译器将适本地推导类型,如 const int将成为参数的完美匹配:

const int k = 10;
foo( k ); // foo<const int>( const int & ) is a perfect match

现在有一个特殊的规则允许调用一个带有右值的常量引用(非可变左值)的函数,这意味着创建一个临时左值,稍后绑定(bind)到该引用,但该规则将启动函数必须事先具有该签名,这就是为什么明确声明模板类型为 const int 的原因作品:foo<const int>(42) .

关于c++ - 从右值参数推导出对 const 的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6075093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com