我有以下代码,无法同时使用带有-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)
的引用)。
以下是问题:
f1
应该编译吗?f2
应该可以编译吗?f1
和f2
时会有如此不同?似乎只有在编译器知道类型F<T>
是“事前”函数时,它才能编译,但是我不确定这是否正确。