【发布时间】:2016-10-28 01:45:11
【问题描述】:
哪一个编译器是对的?
class A
{
public:
template <typename T>
void fun(void (*f)() = funPrivate<T>) {}
private:
template <typename T>
static void funPrivate() {}
};
int main(int argc, char** argv)
{
A a;
a.fun<int>();
return 0;
}
编译良好:gcc 版本 4.8.5 (Ubuntu 4.8.5-2ubuntu1~14.04.1)
导致错误:clang version 3.4-1ubuntu3 (tags/RELEASE_34/final)(基于 LLVM 3.4)
a.cpp:5:27: error: 'funPrivate' is a private member of 'A'
void fun(void (*f)() = funPrivate<T>) {}
^~~~~~~~~~~~~
a.cpp:14:3: note: in instantiation of default function argument expression for 'fun<int>' required here
a.fun<int>();
^
a.cpp:8:16: note: declared private here
static void funPrivate() {}
^
1 error generated.
【问题讨论】:
-
这可能与优化有关。有问题的行什么都不做,所以 GCC 可能正在优化它。 GCC 并不总是抱怨它优化出来的东西的错误。如果您真的尝试使用该函数指针,我会很好奇发生了什么。
-
@WilliamKappler Nothing changed.
-
奇怪的是,如果您将
funPrivate设为不是模板,clang 似乎会接受它。 -
@songyuanyao 更诡异! coliru.stacked-crooked.com/a/c27c76981d1a200e 。我什至不会试图说出其中哪一个(如果有的话)行为正确。
-
@WilliamKappler 有问题的代码 sn-p 已简化,但实际使用会产生相同的错误