gpt4 book ai didi

c++ - 为什么这个模板扩展在 C++ 中是合法的?

转载 作者:搜寻专家 更新时间:2023-10-31 00:26:20 25 4
gpt4 key购买 nike

考虑以下代码:

template <typename T>
void foo(const T& param) {
std::cout << __PRETTY_FUNCTION__ << std::endl;
std::cout << param;
}

int main()
{
foo<const int&>(5);
return 0;
}

输出给出:

void foo(const T&) [with T = const int&]                                                                                                                       
5

这里显然 T 被解析为 const int&(正如打印输出所说,因为我明确地强制这样做)。然而,这似乎产生了一个问题:函数签名采用 const T& 类型的参数,在这种情况下它会扩展为 const const int& &,这不是C++ 中的合法语法。

但程序确实运行良好。这里发生了什么?

更新:我知道 T& & 会折叠成 T&。但是,在这种情况下,如果您显式地编写双 const 也是不合法的,而且我没有看到模板折叠规则提到这一部分。

更新 2:编译 const const int x = 1; 给出 error: duplicate ‘const’。 c++ 中不允许使用多个 const(但令人惊讶的是,在 c 中它是可以的)。

最佳答案

C++ 类型不是通过文本替换形成的。 const T& 其中Tvoid *void* const &,不是const void *&.

您的代码尝试形成“对const T 的左值引用”类型,其中T 是“对const int 的左值引用”。通过 the reference collapsing rules ,这将形成“对 const int 的左值引用”类型。

关于c++ - 为什么这个模板扩展在 C++ 中是合法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52912068/

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