当前位置:  开发笔记 > 编程语言 > 正文

为什么我不能直接在临时对象上调用operator()?

如何解决《为什么我不能直接在临时对象上调用operator()?》经验,为你挑选了1个好方法。

我想做的事情可归纳为以下代码:

struct A{};

struct B{
    A& a;
    B(A& a) noexcept : a(a){}
    int operator()(int) {}
};

int main(){
    A a;
    B(a)(2);
}

我的编译器(g++ 6)拒绝了代码抱怨a阴影参数.但是,如果我尝试显式调用operator(),它会按预期工作.

似乎g++忽略括号并将声明视为声明.

这是指定的还是预期的行为?



1> TartanLlama..:

这是那些icky解析规则之一,一次又一次地抓住你.正如你提到的,B(a)(2);其实就相当于B a(2);,所以你的代码试图初始化Bint.

要解决此问题,您可以使用C++ 11的统一初始化:

B{a}(2);


IOW:如果它_looks_像一个声明,它_is_ adeclaration.不明确的解析被解析为声明,而不是表达式.
或者`(B(a))(2);`
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有