【发布时间】:2018-12-15 00:17:01
【问题描述】:
我在函数中定义的结构中定义了一个静态函数。我想得到一个指向内部函数的模板函数指针。
考虑以下示例:
template <class Func, Func GetToken>
struct token_user {
void foo () { GetToken(); } // Do something with token.
};
struct generator_out {
constexpr static const auto get_token() {return 0;}
};
int main() {
struct generator_in {
constexpr static const auto get_token() {return 0;}
};
// Works fine
token_user<decltype(&generator_out::get_token), &generator_out::get_token>();
// Fails with GCC, works with clang and msvc
token_user<decltype(&generator_in::get_token), &generator_in::get_token>();
}
我使用本地 MSVC 2017 编译器以及 wandbox.org 上的 clang 6.0 和 gcc 8.1 编译器对此进行了测试。 MSVC 和 clang 可以工作,gcc 不行。
谁是正确的? clang 和 msvc 是否过于宽容并弯曲了 c++ 标准,或者 gcc 还没有实现这一点? (或者它甚至可能是一个错误?)标准对此有何评论?
编辑: 来自 gcc 的错误消息:
prog.cc: In function 'int main()':
prog.cc:15:76: error: 'main()::generator_in::get_token' is not a valid template argument for type 'const int (*)()' because 'static constexpr const auto main()::generator_in::get_token()' has no linkage
token_user<decltype(&generator_in::get_token), &generator_in::get_token>(); // Fails with GCC, works with clang and msvc
【问题讨论】:
-
@OlivierSohn 说明符的顺序无关紧要,只是个人喜好问题。
-
@VTT 我不确定这是否是一个错误。可能是 msvc 和 clang 只支持实验性功能。
-
@C.Esch 如果 gcc 打印
error:是一个错误。标准还定义了函数内定义没有链接,但我不确定为什么它会阻止 gcc 使用指向函数的指针作为模板参数。 -
可能链接到this
-
clang 6.0 的错误也是std std=c++17时没问题
标签: c++ gcc visual-c++ clang language-lawyer