当前位置: 首页 > 知识库问答 >
问题:

用clang编译SFINAE表达式失败

冉子石
2023-03-14
#include <type_traits>
#include <cstddef>

template<std::size_t N, std::size_t M, std::enable_if_t<not (N>M)>* = nullptr> // (1)
struct S: public S<N+1, M> { };

template<std::size_t N>
struct S<N, N> { };

int main() {
    S<0, 1> c{};
}

8:错误:非类型模板参数专用于具有依赖类型'std::enable_if_t M)>*的模板参数(又名'typename enable_ifm),void>::type*')
结构S{};

同样的代码使用以下行而不是(1)如预期的那样工作:

template<std::size_t N, std::size_t M, typename = std::enable_if_t<not (N>M)>>

SFINAE表达式几乎相同。它基于std::enable_if_t的专门化,我希望这两个示例的结果(成功或失败)相同。
我的期望错了吗?

共有1个答案

秦珂
2023-03-14

我认为这实际上是一个gcc bug,因为[temp.class.spec]:

与专门化的非类型参数相对应的模板参数的类型不应依赖于专门化的参数。[示例:

template <class T, T t> struct C {};
template <class T> struct C<T, 1>;       // error

template< int X, int (*array_ptr)[X] > class A {};
int array[5];
template< int X > class A<X,&array> { }; // error

-结束示例]

 类似资料:
  • 本文向大家介绍C++ 用Clang编译,包括了C++ 用Clang编译的使用技巧和注意事项,需要的朋友参考一下 示例 由于锵前端被设计为是与GCC兼容,当你交换可通过GCC编译大多数程序将编译g++通过clang++在构建脚本。如果没有-std=version给出,将使用gnu11。 习惯了MSVC的Windows用户可以cl.exe与交换clang-cl.exe。默认情况下,clang尝试与已安

  • 问题内容: 我正在研究道格·海尔曼(Doug Hellman)的“示例Python标准库”,并发现了这一点: “ 1.3.2编译表达式re包含用于将正则表达式作为文本字符串使用的模块级函数,但是编译程序经常使用的表达式更为有效。” 对于这种情况,我无法理解他的解释。他说“模块级功能维护编译后的表达式的缓存”,并且由于“缓存的大小”受到限制,因此“直接使用编译后的表达式可以避免缓存查找开销。” 如果

  • 编译正则表达式 正则表达式被编译成 RegexObject 实例,可以为不同的操作提供方法,如模式匹配搜索或字符串替换。 #python >>> import re >>> p = re.compile('ab*') >>> print p <_sre.SRE_Pattern object at 0xb76e1a70> re.compile() 也接受可选的标志参数,常用来实现不同的特殊功能和语

  • 以下代码在GCC下编译良好,但在clang中失败并出现错误: 没有用于“Bar”初始化的匹配构造函数 问题似乎是clang认为Foo的模板构造函数被Bar的模板构造函数隐藏或覆盖。 这是clang中的bug还是GCC中的非标准特性? 如何解决这个问题?我无法更改Foo,因为它是第三方。 https://gcc.godbolt.org/z/etvpvF

  • 问题内容: 这是一段Java代码: 它不编译,什么是概率?错误:该行上有多个标记;’bool’变量上的语法错误。我希望它能打印出来。虽然根据我的教程书可以打印。 我知道它会发生短路,但如果&&双方都需要进行评估,那不是家庭作业,我正在学习Java。干杯 问题答案: 等效于:- 由于被评估为,因此第二个表达式不被评估,因为在那里您使用了 短路运算符(||) 。 因此,最后两个任务不会发生。和值和保持

  • 我正在试用新的数据绑定库。我有一个奇怪的问题,属性的绑定没有编译。 这是xml文件的简化版本: 编译时收到以下消息: java.lang.RuntimeException:发现数据绑定错误. ****/ 数据绑定错误****msg:标识符必须具有XML文件中用户定义的类型。视图缺少它 当我删除声明时,一切都会编译(并正常工作!)。 我不知道我错过了什么