1

コンストラクターですべての作業を行うクラスがあります(そこで構築され、いくつかの計算を実行し、それらを出力し、コンストラクターでこれらすべてを破棄します)。

ここに簡略化されたコードがあります:

#include <iostream>

class myInt {
public:
    myInt(int init) : mInt(init) {}

    int mInt;
};

class SinglePara {
public:
    SinglePara(myInt first) : member(first.mInt) { std::cout << member << std::endl; this->~SinglePara(); }

    int member;
};

class TwoPara {
public:
    TwoPara(myInt first, myInt second) : member1(first.mInt), member2(second.mInt) { std::cout << member1 + member2 << std::endl; this->~TwoPara(); }

    int member1, member2;
};

int main()
{
    myInt one(1), two(2), three(3);
    TwoPara myTwo(one, two);      // outputs 3 as expected
    TwoPara(one, two);            // outputs 3 as expected

    SinglePara mySingle(three);   // outputs 3 as expected
    SinglePara(three);            // won´t compile

    std::cin.ignore();
    return 0;
}

これで、私のコードの最初の 3 つの例は、期待どおりに動作します。threeしかし、最後のものはコンパイルさえしませんmyInt。WhenSingleParaTwoParatake as Arguments 整数の代わりにmyIntthen 4 つの例はすべて、私が望むように動作します。

誰かがこの動作を説明し、可能であれば 4 番目の例を修正する方法を教えてもらえますか?

MSVC 2013 を使用しています

4

1 に答える 1

6

君の

SinglePara(three);

と同等です

SinglePara three;

これは、名前の前後にthree一対の冗長があるobject の単なる宣言です。しかし、以前に宣言され()たという名前のオブジェクトが既にあります。three同じスコープで別のものを宣言することはできません。したがって、エラー。

SinglePara(three)タイプ の一時オブジェクトを作成する式にしたかったようSingleParaです。通常、式であることを明確に示すコンテキストで使用すると、「単独で」発生します。あなたの場合、コンテキストなしでそれを使用し、「式と宣言」のあいまいさを作成しました。これは常に宣言を支持して解決されます。

本当に短期間の一時ファイルを作成したい場合は、式固有の何かがコンパイラを適切な方向にプッシュするのに役立ちます。たとえば、コンマ演算子を架空に使用すると、明確に式になります

SinglePara((0, three)); // OK
0, SinglePara(three); // OK

解決策としては、これはかなり洗練されていませんが、問題の性質を示しています。コメントで提案されているように、より良い解決策として、括弧のペアを追加できます

(SinglePara(three));

コンパイラにそれを式として認識させます。

于 2013-11-10T09:07:20.363 に答える