gpt4 book ai didi

c++ - GNU C++ 和 Clang 中的模板实例化

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

看起来 Clang (3.8) 和 GNU C++ (4.9) 中模板实例化的规则不一样。这是一个例子:

#include <cstddef>

template <bool>
class Assert {
Assert(); // private constructor for Assert<false>
};

template <>
class Assert<true> { // implicit public constructor for Assert<true>
};

template <size_t N>
class A {
};

template <class T, size_t N>
T foo(A<N>) {
return T(N - 1);
}

template <class T>
T foo(A<0>) { // foo is not defined for N=0
Assert<false>();
return T(0);
}

int main(int argc, char **argv) {
foo<int>(A<3>());
return 0;
}

这个最小的例子展示了一个模板函数,foo , 这是对类型 T 的概括和一个自然数 N .此函数未为 N=0 定义, 所以我想使用 Assert如果以这种方式使用类,则发出编译器错误信号。

这段代码被 GNU 编译器接受(也被 Visual C++ 2015 接受),但 Clang 给出了“调用类 Assert<false> 的私有(private)构造函数”的错误。

那么谁是对的呢?如我所见,不需要 foo<T,0> , 所以不需要实例化这个模板...

编辑:接受 Clang 对标准的解释,对模板参数强制执行编译时检查的规范方法是什么?

最佳答案

我相信 clang 是正确的,因为 Assert<false>不是依赖类型。

http://en.cppreference.com/w/cpp/language/dependent_name

Non-dependent names are looked up and bound at the point of template definition. This binding holds even if at the point of template instantiation there is a better match:

不要进行无效的特化。使它们通用并使用 static_assert (具有依赖值)来检查无效的模板参数类型/值。 static_assert(std::is_same<T, int>::value)static_assert(N != 0)

关于c++ - GNU C++ 和 Clang 中的模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40702274/

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