作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下代码,我很困惑为什么没有选择特化。
#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/
我是一名优秀的程序员,十分优秀!