gpt4 book ai didi

c++ - 为什么 g++ 10.1 会提示头文件中的命名 lambda 而其他人则不会?

转载 作者:行者123 更新时间:2023-12-01 14:42:46 25 4
gpt4 key购买 nike

我有一个带有命名 lambda 的头文件,用于测量某些函数的执行时间(lambda 部分是这个问题的结果 How to Write a Lambda Wrapping a Function with Optional Return Value )。它驻留在我从几个翻译单元中包含的头文件中。这在 g++ 8 和 g++ 9 中运行良好。现在当我切换到 g++ 10.1 时,链接时出现错误。

请检查以下简化示例。

以下是 Wandbox 中的示例:https://wandbox.org/permlink/Sizb6txrkW5dkJwT .

文件“Lambda.h”:

#pragma once

#include <string>

auto measure = [](bool enabled, const std::string& taskName, auto&& function,
auto&&... parameters) -> decltype(auto)
{
return std::forward<decltype(function)>(function)(
std::forward<decltype(parameters)>(parameters)...);
};

文件“Test1.cpp”:
#include "Lambda.h"

文件“Test2.cpp”:
#include "Lambda.h"

然后我像这样构建:
g++ -c Test1.cpp
g++ -c Test2.cpp
g++ -shared -o Test.dll Test1.o Test2.o

一切正常,直到 g++ 9.2,但使用 g++ 10.1 我收到此错误消息:
ld.exe: Test2.o:Test2.cpp:(.bss+0x0): multiple definition of `measure'; Test1.o:Test1.cpp:(.bss+0x0): first defined here
collect2.exe: error: ld returned 1 exit status

为什么?如何使用 g++ 10.1 编译我的项目?我使用命名的 lambda 就像使用模板函数一样,因此我需要将命名的 lambda 写入头文件,以便能够在项目的任何地方使用它,而且我无法以某种方式将声明与定义分开,对吗?

我期待着答案!

最佳答案

I get an error when linking.

Why?



因为您多次定义变量违反了单一定义规则。

and others do not?

Why?



¯\_(ツ)_/¯ 不需要语言实现来诊断 ODR 违规。

I use the named lambda like I would use a template function, therefore I need to write my named lambda into a header file to be able to use it anywhere in the project and I cannot somehow separate declaration from definition, right?



对。

How can I compile my project with g++ 10.1?



简单的解决方案:声明变量 inline (C++17 特性)。

很简单,但每个 TU 都有自己的实例,这是一个奇怪的细节:声明变量 static .

第三种解决方案:lambda 什么也没有捕获,所以你不妨定义一个模板函数。

第四种解决方案:不要将 lambda 存储为全局变量,而是编写一个返回 lambda 实例的内联函数。

关于c++ - 为什么 g++ 10.1 会提示头文件中的命名 lambda 而其他人则不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62150048/

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