GCC 6.x警告有关Lambda可见性
GCC 6.x warning about lambda visibility
我正在构建一个共享库,其中包含一堆lambdas,其中一些lambdas是在其他lambdas内部创建的。但是,当我使用-fvisibility =隐藏和 - wall时,我会警告说具有更大可见性的声明,老实说,我不明白。我有一个最小的例子:
#include <memory>
template<class T>
class MyClass {
public:
MyClass() {
#if 0
auto fn = [this] { /*Do something useful here*/ };
auto outer = [this,fn]() { /*use fn for something here*/ };
#else
auto outer = [this]()
{
auto fn = [this] { /*Do something useful here */ };
//use fn for something here
};
#endif
/* use outer for something */
}
};
int main() { MyClass<int> r; }
如果我编译了此信息,我会收到以下警告:
% g++ -Wall -fvisibility=hidden -Wno-unused-but-set-variable -o visibility_test.cpp.o -c visibility_test.cpp
visibility_test.cpp: In instantiation of ‘struct MyClass<T>::MyClass()::<lambda()> [with T = int]::<lambda()>’:
visibility_test.cpp:13:22: required from ‘MyClass<T>::MyClass()::<lambda()> [with T = int]’
visibility_test.cpp:11:23: required from ‘struct MyClass<T>::MyClass() [with T = int]::<lambda()>’
visibility_test.cpp:11:14: required from ‘MyClass<T>::MyClass() [with T = int]’
visibility_test.cpp:22:27: required from here
visibility_test.cpp:13:32: warning: ‘MyClass<T>::MyClass()::<lambda()> [with T = int]::<lambda()>’ declared with greater visibility than the type of its field ‘MyClass<T>::MyClass()::<lambda()> [with T = int]::<lambda()>::<this capture>’ [-Wattributes]
auto fn = [this] { /*Do something useful here */ };
如果我将#if 0更改为#if 1,从而将FN的创建移至" outer" lambda外部,都可以很好地编译。
当我在拱箱上安装GCC 6时,此警告开始出现。用6.3.1和7.1.1编译时,我得到了它。
所以,我的问题是:
- 这个警告试图告诉我什么?
- 我如何摆脱警告而不必违反我的代码太多(在我的示例中移动lambdas并不是真正的选择。(
更新:因此,我已经接受了这是GCC中的一个错误,现在我想摆脱具有最小副作用的警告。因此,我在myClass的构造函数中添加了" __attribute__((可见度("默认"((((,它似乎很好地工作。
看起来这是GCC中的错误。
有错误报告,没有Lambdas之前有相同的警告。您可以使用-fvisibility
默认值处理此操作,或者通过属性手动对隐藏/默认值的可见性进行处理。
相关文章:
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 班级成员可见性C++
- 内联模板函数的可见性
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 符号可见性和 gcc 警告
- C++/libscreen 无法更新可见性
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- C++继承构造函数的可见性
- CRTP - 嵌套叶类类型的可见性
- C++模板 - 实例之间的通用操作和成员可见性
- 放松的订单和线程间可见性
- GCC 6.x警告有关Lambda可见性
- C++ 中的Shared_ptr和内存可见性
- 静态库中的符号可见性和操作
- 未直接继承的基模板类成员的可见性
- 从shm_open() mmap()更改对共享内存的可见性
- 关于Lambdas,转换以功能指针以及私人数据成员的可见性