
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是否存在于匿名命名空间中?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)