其他分享
首页 > 其他分享> > c – 可以使用自动占位符来推断非类型模板参数中的函数结果吗?

c – 可以使用自动占位符来推断非类型模板参数中的函数结果吗?

作者:互联网

考虑简单的例子:

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'

解决方法:

是的,自动可以使用inside a compound type([temp.param]/4.6,[dcl.type.auto.deduct]).我相信gcc在你的第二个例子中是错误的:在执行演绎之前你的显式指定的T被替换([temp.deduct] /2.3,/ 5和/ 6,由[dcl.type.auto.deduct]引用] /2.3和/ 4).

标签:c,language-lawyer,templates,c17
来源: https://codeday.me/bug/20191006/1862237.html