c++ - 解析对临时函数对象的调用中的歧义

标签 c++ constructor arguments most-vexing-parse function-object

我怀疑在下面的代码中,由于最令人头疼的解析问题,对同时具有构造函数参数和函数调用运算符参数的临时函数对象的调用在某种程度上是模棱两可的。

#include <iostream>

class Fun
{
public:
        explicit Fun(int i): v_(i) {}

        void operator()(int j) const 
        { 
                std::cout << (v_ + j) << "\n"; 
        }

private:
        int v_; 
};

int main()
{
        int a = 1;
        int b = 2;

        Fun(a)(b);   // ERROR: conflicting declaration 'Fun a'
        (Fun(a))(b); // OK: prints 3
        return 0;
}

Ideone 上输出.

添加像 (Fun(a))(b) 这样的括号可以解决问题,但我不太明白 Fun(a)(b) 是如何实现的解析为声明 Fun a

最佳答案

不幸的是 Fun(a)(b); 可以被解析为 Fun a(b); 这是一个声明,而不是一个临时对象。

参见 Most vexing parse

关于c++ - 解析对临时函数对象的调用中的歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12742658/

相关文章:

c - 为什么我不能用动态参数设置 printf 的输出格式?

c++ - 删除指向指针列表的指针

c++ - CStringArray::GetAt(int index) 返回一个常量。为什么?

java - 使用可变参数在 kotlin 中调用构造函数

python - 我必须为 argparse.FileType 指定什么模式来追加,保持 - 作为默认值

javascript - 如何在不使用 "arguments"的情况下计算 JavaScript 函数的参数数量?

c++ - 如何声明和实现一个 const 和 inline 成员函数?

c++ - 如何正确重写 ASSERT 代码以在 msvc 中传递/分析?

c++ - 在类中为静态无符号字符传递和分配值

c++ - char 数组在构造函数中被解释为 char 指针,请帮忙