1

以下のコードでは、コンストラクター引数と関数呼び出し演算子引数の両方を使用した一時関数オブジェクトの呼び出しは、最も厄介な解析の問題のために、どういうわけかあいまいであると思われます。

#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

4

2 に答える 2

2

残念ながら、これは宣言であり、一時オブジェクトではないものFun(a)(b);として解析できます。Fun a(b);

最も厄介な解析を参照してください

于 2012-10-05T08:52:02.170 に答える
1

関数宣言構文を理解するための簡単な例:

#include <iostream>

void (foo)(int a) {
   std::cout << a << std::endl;
}

int main() {
   foo(5);
}

したがって、あなたの場合、これを使用する必要があります:

Fun(a).operator()(b); 
(Fun(a))(b);
于 2012-10-05T08:53:28.460 に答える