非本地C 11 lambdas是否存在于匿名命名空间中?

非本地C 11 lambdas是否存在于匿名命名空间中?,第1张

概述最新版本的GCC 4.8在头文件中提供以下代码: auto L = [](){};struct S{ decltype(L) m;}; 以下警告: test.hpp:3:8: warning: 'S' has a field 'S::m' whose type uses the anonymous namespace [enabled by default] struct S 最新版本的GCC 4.8在头文件中提供以下代码:
auto L = [](){};struct S{    decltype(L) m;};@H_502_3@  

以下警告:

test.hpp:3:8: warning: 'S' has a fIEld 'S::m' whose type uses the anonymous namespace [enabled by default] struct S        ^@H_502_3@  

为什么编译器会考虑lambda的类型来使用匿名命名空间?我使lambda全局化,我没有在任何地方使用匿名命名空间.

更新:即使我将lambda放在显式名称空间中,compiles也会发出相同的警告,如下所示:

namespace N{    auto L = [](){};}struct S{    decltype(N::L) m;};@H_502_3@  

更新2:事实上,甚至类范围lambda都有同样的问题:

class N{    static constexpr auto L = [](){};};struct S{    decltype(N::L) m;};@H_502_3@解决方法 海湾合作委员会的警告可能有点令人困惑,但其意图当然是正确的. lambda的类型是未命名的,并且在整个程序中是唯一的.另一方面,如果您的类没有放入未命名的命名空间(根据您的描述,我认为不是),您的类在您包含它的每个翻译单元中都是相同的类型.由于同一个类应该具有相同的成员,而不是不同的翻译单元中的不同成员,因此这是违规(并导致未定义的行为).    

至少同样糟糕的是L是extern,因此一旦将标题包含在多个翻译单元中,您将得到“L的多个定义”链接器错误.

总结

以上是内存溢出为你收集整理的非本地C 11 lambdas是否存在于匿名命名空间中?全部内容,希望文章能够帮你解决非本地C 11 lambdas是否存在于匿名命名空间中?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1255614.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-07
下一篇2022-06-07

发表评论

登录后才能评论

评论列表(0条)

    保存