关于lambda可见性的GCC 6.x警告

时间:2017-06-06 13:09:22

标签: c++ c++11 gcc lambda

我正在构建一个包含一堆lambdas的共享库,其中一些lambdas是在其他lambdas中创建的。但是,当我使用-fvisibility = hidden和-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的创建移到“外部”lambda之外,那么它们编译得很好。

当我在Arch框上安装GCC 6时,此警告开始出现。我在使用6.3.1和7.1.1编译时得到它。

所以,我的问题是:

  1. 这个警告试图告诉我什么?
  2. 如何在不必过多违反我的代码的情况下摆脱警告(在我的示例中移动lambda不是一个真正的选择。)
  3. 更新:所以,我已经接受了这是GCC中的一个错误,我现在想要以最小的副作用摆脱警告。所以我将“__attribute __((visibility(”default“)))”添加到MyClass的构造函数中,它看起来效果很好。

1 个答案:

答案 0 :(得分:5)

看起来它是gcc中的一个错误。

bug report并且在没有lambdas的情况下也有相同的警告。您可以使用-fvisibility默认值处理此操作,也可以手动将可见性设置为隐藏/默认属性。