考虑简单的例子:
template <auto(*X)()>
struct Foo {
decltype(X()) x;
};
int bar();
int main() {
static_cast<void>(Foo<bar>{});
}
[gcc]和[clang]似乎都接受了这些代码。代码真的符合c ++ 17吗?如果是这样,还有一些其他规则会导致以下代码生成错误吗?
template <class T, auto(*X)(T)>
struct Foo {
decltype(X(0)) x;
};
int bar(int);
int main() {
static_cast<void>(Foo<int, bar>{});
}
这只让[gcc]感到不快。
错误讯息:
prog.cc: In function 'int main()':
prog.cc:9:35: error: unable to deduce 'auto (*)(T)' from 'bar'
static_cast<void>(Foo<int, bar>{});
^
prog.cc:9:35: note: mismatched types 'T' and 'int'
答案 0 :(得分:2)
是的,可以使用auto
inside a compound type([temp.param]/4.6,[dcl.type.auto.deduct])。我相信你的第二个例子中gcc是错误的:在执行演绎之前你明确指定的T
int
被替换([temp.deduct] /2.3,/ 5和/ 6,由[引用] dcl.type.auto.deduct] /2.3和/ 4)。