繁体   English   中英

在 C++20 中是否允许通过非类型模板参数中的类类型传递函数指针?

[英]Is passing of a function pointer through a class type in non-type template parameter allowed in C++20?

最近,在尝试了能够在非类型模板参数 ( P0732R2 ) 中传递类类型的 C++20 特性之后,我遇到了一些很奇怪的事情。

考虑以下代码:

template <typename T>
struct abc {
    T p;
    consteval abc(T p) : p(p) { }
    consteval operator decltype(p)() const {
        return p;
    }
};

template <abc obj>
consteval auto do_something1() {
    return obj();
}

template <auto obj>
consteval auto do_something2() {
    return obj();
}

constexpr auto fun() {
    return true;
}

int main() {
    static_assert(do_something1<&fun>()); // OK in Clang, fails in GCC
    static_assert(do_something2<&fun>()); // OK in both GCC and Clang
}

这似乎与 clang 预期的一样,但是 GCC 无法编译它并给出错误,指出fun不是有效的模板参数

但是,这个答案说,根据 C++ 标准,函数指针应该是有效的模板参数。

哪个编译器在这里是正确的?

此外,奇怪的是,当出于某种原因修改为与成员函数一起使用时,相同的代码似乎可以在两个编译器上运行

注意:需要注意的一点是,根据页面,GCC 对P0732R2的支持已完成,而 Clang 仍处于部分/实验阶段。 那么,这是否意味着 GCC 是正确的,并且通过非类型模板参数中的类类型传递函数指针是不可能的,还是我在这里遗漏了什么?

哪个编译器在这里是正确的?

Clang 是正确的,所写的代码是有效的。

GCC 不处理该特定情况是一个已知问题

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM