gpt4 book ai didi

c++ - 为什么这个模板代码不选择偏特化?

转载 作者:行者123 更新时间:2023-11-30 04:59:05 24 4
gpt4 key购买 nike

我有以下代码,我很困惑为什么没有选择特化。

#include<iostream>
using namespace std;
namespace detail {
struct tag {};
}

template<auto& X, typename Y>
struct s{
static constexpr auto val = 11;
};
template<auto& X>
struct s<X,detail::tag>{
static constexpr auto val = 22;
};

int main()
{
static constexpr long long arr[] = {42ll,47ll};
cout << s<arr, detail::tag>::val << endl; //outputs 11, not 22
cout << s<arr, int>::val << endl;
}

附言我不确定我是否正确地专门化了模板,但它可以编译,所以我想它可能没问题。

最佳答案

代码格式不正确,编译器应该报告错误。用于非类型引用模板参数的参数必须是 (C++17 14.3.2)

a constant expression (5.19) that designates the address of a complete object with static storage duration and external or internal linkage or a function with external or internal linkage

如果对象可以从同一翻译单元中的其他作用域引用,则该对象具有内部链接;如果可以从同一翻译单元和其他翻译单元中的其他作用域引用,则该对象具有外部链接。模板参数 arr 在 main 函数的范围内声明,并且仅在该范围内可见,因此没有链接,不应与任何模板匹配。

当我在安装在我机器上的编译器上尝试时,clang (6.0.0-1ubuntu2) 显示出与问题中相同的行为,而 gcc (7.3.0-16ubuntu3) 报告 arr 是一个没有链接的名字。如果我将 arr 移到函数范围之外(从而为其提供外部链接),两个编译器都会接受代码并给出预期的结果。

关于c++ - 为什么这个模板代码不选择偏特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51388986/

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