gpt4 book ai didi

c++ - 具有默认 std::function 参数的模板函数导致符号 [...] 已经定义

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:42:25 25 4
gpt4 key购买 nike

我刚刚遇到了一些奇怪的事情。我想知道这是否是一个错误,如果不是,我希望有人能解释这个问题。

我的问题是,当我创建一个将 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;
}

https://ideone.com/VlVcUv

编译此代码时出现以下错误:

{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

最佳答案

这是一个 gcc 错误(在版本 7.3 之后看起来已修复)我们可以通过查看部分 [expr.prim.lambda.capture]p9 来了解这一点:

A lambda-expression appearing in a default argument shall not implicitly or explicitly capture any entity. [Example:

void f2() {
int i = 1;
void g1(int = ([i]{ return i; })()); // ill-formed
void g2(int = ([i]{ return 0; })()); // ill-formed
void g3(int = ([=]{ return i; })()); // ill-formed
void g4(int = ([=]{ return 0; })()); // OK
void g5(int = ([]{ return sizeof i; })()); // OK
}

—end example]

作为 IDEOne 的替代品,您可以使用与 gcc 和 clang 版本保持同步的 Wandbox,请参阅 your example live there .

关于c++ - 具有默认 std::function 参数的模板函数导致符号 [...] 已经定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52967805/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com