为什么 g++ 10.1 抱怨头文件中的命名 lambda,而其他人则没有?
Why does g++ 10.1 complain about a named lambda in a header file and others do not?
我有一个带有命名lambda的头文件,用于测量某些函数的执行时间(lambda部分是这个问题的结果 如何编写一个 lambda 用可选的返回值包装函数(。它驻留在我从几个翻译单元包含的头文件中。这在 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)...);
};
文件"测试1.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写入头文件才能在项目中的任何位置使用它,并且我不能以某种方式将声明与定义分开,对吧?
我期待着答案!
链接时出现错误。
为什么?
因为多次定义变量违反了一个定义规则。
而其他人没有?
为什么?
̄\_(ツ)_/̄ 诊断 ODR 违规不需要语言实现。
我使用命名的lambda就像使用模板函数一样,因此我需要将命名的lambda写入头文件才能在项目中的任何位置使用它,并且我不能以某种方式将声明与定义分开,对吧?
右。
如何使用 g++ 10.1 编译我的项目?
简单的解决方案:声明变量inline
(C++17 功能(。
很简单,但有一个奇怪的细节,每个 TU 都有自己的实例:声明变量static
。
第三种解决方案:lambda 不捕获任何内容,因此您不妨定义一个模板函数。
第四种解决方案:不要将 lambda 存储为全局变量,而是编写一个返回 lambda 实例的内联函数。
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 在 lambda 捕获中声明的变量的类型推导
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 为什么lambda在clang上崩溃而不是在gcc上崩溃
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 使lambda不可复制/不可移动
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- AWS Lambda C++运行时权限被拒绝
- 捕获lambda中的std::数组
- 这 4 个 lambda 表达式之间有什么区别?
- 在实现文件中使用头文件的通用 lambda
- 为什么 g++ 10.1 抱怨头文件中的命名 lambda,而其他人则没有?