C ++中的模板化函数类型静态类成员

时间:2020-01-17 04:02:27

标签: c++ templates g++ language-lawyer c++20

我有以下代码,无法同时使用带有-std=c++2a的g ++ 8.3和clang 9.0.0进行编译。

#include <type_traits>

template<class T>
using F = std::conditional_t<
            std::is_same_v<T, int>, int,int(T)>;
template<class T>
struct A{
    static F<double> f1; // OK
    static F<T> f2; // variable 'f2' has function type
};
int main(){
    A<double> a;
    A<double>::f1(1.3);
}

如果我将这一行注释掉

    static F<T> f2; // variable 'f2' has function type

它将编译(链接错误报告未定义对A<double>::f1(double)的引用)。

以下是问题:

  1. f1 应该编译吗?
  2. 如果是,f2应该可以编译吗?
  3. 如果没有,为什么在处理f1f2时会有如此不同?

似乎只有在编译器知道类型F<T>是“事前”函数时,它才能编译,但是我不确定这是否正确。

0 个答案:

没有答案