首页 > 解决方案 > C++ 中的模板化函数类型静态类成员

问题描述

我有以下代码,它不能与 g++ 8.3 和 clang 9.0.0 一起编译-std=c++2a

#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. 如果不是,为什么在处理f1和处理上有这样的差异f2

似乎当且仅当编译器知道类型F<T>是“预先”的函数时,它才会编译,但我不确定这是否是正确的行为。

标签: c++templatesg++language-lawyerc++20

解决方案


推荐阅读