Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么这个模板代码不选择部分专门化?_C++_Templates_Partial Specialization_Non Type - Fatal编程技术网

C++ 为什么这个模板代码不选择部分专门化?

C++ 为什么这个模板代码不选择部分专门化?,c++,templates,partial-specialization,non-type,C++,Templates,Partial Specialization,Non Type,我有下面的代码,我不明白为什么没有选择专门化 #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>

我有下面的代码,我不明白为什么没有选择专门化

#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

一种常量表达式5.19,指定具有静态存储持续时间和外部或内部链接的完整对象的地址,或具有外部或内部链接的函数的地址

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


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

您使用的编译器和版本是什么?如果您将arr移到main之外,它似乎可以工作。根据标准,代码的格式不正确,不应编译。如果是这样,那是由于编译器中的错误。引用非类型模板参数必须引用具有外部或内部链接的名称。变量arr没有连接。这很奇怪。。。即使是C++标准,CLAN和GCC都接受BUGGY代码…Johan如果你确定代码被破坏了,请回答这个问题,最好说明你为什么认为代码是非法的。我唯一的问题是,这是一个很小的例子,我的真实代码可能没有帮助,但如果你是正确的,你可以回答我的问题。@super我使用clang 6.0…如果我将arr移动到函数范围内,从而给它外部链接,你是说在函数范围外吗?