【发布时间】:2018-10-24 11:27:18
【问题描述】:
我刚刚遇到了一些奇怪的事情。 我想知道这是否是一个错误,如果不是,我希望有人能解释这个问题。
我的问题是,当我创建一个将std::function 作为默认参数的模板化函数时,我只能创建该函数的一个模板实例化,否则会出错。
考虑以下代码:
#include <functional>
template<bool B>
void wut(std::function<void()> f = []() {})
{
f();
}
int main() {
wut<false>(); // works
wut<false>(); // still works
wut<true>(); // error
return 0;
}
编译这段代码时出现以下错误:
{standard input}: Assembler messages:
{standard input}:28: Error: symbol `_ZNSt14_Function_base13_Base_managerIUlvE_E10_M_managerERSt9_Any_dataRKS3_St18_Manager_operation' is already defined
{standard input}:127: Error: symbol `_ZNSt17_Function_handlerIFbvEUlvE_E9_M_invokeERKSt9_Any_data' is already defined
【问题讨论】:
-
直觉上我会说你不能拥有两个具有相同名称和相同签名的不同函数。另一方面,我不知道标准是否真的要求
wut<true>和wut<false>成为两个不同的功能(因此我删除了我的答案) -
本地我使用的是 GCC 7.3.0。我刚刚尝试使用 clang 6.0.0 进行编译,它可以工作。所以看来我偶然发现了一个 GCC 错误。
-
无法使用 GCC 7.3.0 gcc.godbolt.org/z/dRSrUw 重现,否则使用最新版本的 GCC、Clang 和 MSVC,它可以正常编译。
-
我也无法使用 GCC 6.3 进行复制(Ideone 说它正在使用)。很奇怪。
-
嗯很有趣!我使用的精确编译器版本是 g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0
标签: c++ templates std-function