gpt4 book ai didi

c++ - 替换失败是依赖非类型模板参数的错误吗?

转载 作者:可可西里 更新时间:2023-11-01 16:10:27 31 4
gpt4 key购买 nike

假设我有这些模板别名:

enum class enabler {};

template <typename T>
using EnableIf = typename std::enable_if<T::value, enabler>::type;
template <typename T>
using DisableIf = typename std::enable_if<!T::value, enabler>::type;

我可以在 GCC 中执行以下操作:

#include <iostream>

template <typename T, EnableIf<std::is_polymorphic<T>> = {}>
void f(T) { std::cout << "is polymorphic\n"; }

template <typename T, DisableIf<std::is_polymorphic<T>> = {}>
void f(T) { std::cout << "is not polymorphic\n"; }

struct foo { virtual void g() {} };

int main() {
f(foo {});
f(int {});
}

它打印:

is polymorphic
is not polymorphic

这符合我的期望。

使用 clang 时代码无法编译。它会产生以下错误消息。

test.cpp:11:58: error: expected expression
template <typename T, EnableIf<std::is_polymorphic<T>> = {}>
^
test.cpp:14:59: error: expected expression
template <typename T, DisableIf<std::is_polymorphic<T>> = {}>
^
test.cpp:20:3: error: no matching function for call to 'f'
f(foo {});
^
test.cpp:12:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is polymorphic\n"; }
^
test.cpp:15:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is not polymorphic\n"; }
^
test.cpp:21:3: error: no matching function for call to 'f'
f(int {});
^
test.cpp:12:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is polymorphic\n"; }
^
test.cpp:15:6: note: candidate template ignored: couldn't infer template argument ''
void f(T) { std::cout << "is not polymorphic\n"; }
^
4 errors generated.

它应该编译吗?这两个编译器哪个有问题?

最佳答案

首先,感谢@ Richard Smith#llvm IRC Channel on oftc 上的解释。
不幸的是,这不是合法的 C++,因此 Clang 是正确的:{} 不是表达式而是 braced-init-list 因此永远不会是 constant 非类型模板参数的初始化程序中需要的表达式。

§14.3.2 [temp.arg.non-type] p1

A template-argument for a non-type, non-template template-parameter shall be one of:

  • for a non-type template-parameter of integral or enumeration type, a converted constant expression (5.19) of the type of the template-parameter; or
  • [...]

一个解决方案是在 enabler 中添加一个虚拟值。

关于c++ - 替换失败是依赖非类型模板参数的错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10180552/

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