0

私のコードは次のとおりです。

typedef double Money;
class Person
{
    Money get(){return a;}
private:
    typedef long double Money;
    Money a;
};

aこのクラスを定義します。 :doubleまたはlong double?の型を知りたいです。

関数の戻り値の型はget()ですdoubleよね?

関数std:is_sameを使用して型をテストしましたa

typedef double Money;
class Person
{
public:
    Money get(){return a;}
    void test()
    {
        cout<<is_same<decltype(a), double>::value<<endl;  // false
        cout<<is_same<decltype(a), long double>::value<<endl; //true
    }
private:
    typedef long double Money;
    Money a;
};

のタイプはaですlong double

4

5 に答える 5

1

これは無効な C++ コードであるため、質問に対する回答はありません。C++ では、Moneyが最初に表示されたときMoneyと後で再評価されたときに、どちらの場合も同じ型である必要があります。GCC はこれに対してハード エラーを生成します。他のコンパイラはそれを受け入れるかもしれませんが、受け入れる場合、標準はどの typedef が使用されるかを述べていません。

get()関数を削除すると、ローカルの typedef がグローバルの typedef をシャドウするため、の型aはになります。long doubleその場合、ローカルの typedefMoneyが使用される前に表示され、問題はありません。

于 2013-08-10T09:00:07.003 に答える
0

この場合の標準の該当部分は、§3.3.7/1:2 および 3 であると思います。

2) クラス S で使用される名前 N は、そのコンテキスト内で同じ宣言を参照し、S の完全なスコープで再評価される場合に参照するものとします。この規則違反の診断は必要ありません。

3) クラス内のメンバー宣言の順序を変更すると、(1) および (2) の下で別の有効なプログラムが生成される場合、そのプログラムは不正な形式であり、診断は必要ありません。

Moneyの定義で使用される名前Personは、 の戻り値の型の定義のコンテキストでは をPerson::get参照し::Moneyますが、 の完全なスコープで再評価されると、 をPerson参照し::Person::Moneyます。

同様に、of が of の前になるようにメンバー宣言を並べ替えるとtypedefPerson::MoneyPerson::getの有効なプログラムが生成されます。

そのため、コードの形式が正しくないように見えますが、診断が必要ないため、VC++ と gcc の両方がこの点で等しく準拠しています。(VC++ のように) 黙って受け入れられるよりも、(gcc のように) 違反が診断されることを私は確かに好みます。

于 2013-08-10T10:12:12.260 に答える
0

この線

typedef long double Money;

プレゼントです

つまりa、タイプMoneyMoneyあり、long double

于 2013-08-10T08:59:40.167 に答える
0

最も簡単な方法は、それを確認することです:

#include <iostream>

typedef char Money;

class Person
{
    public:
        void checkType()
    {
        if (sizeof(char) == sizeof(long))
        {
            std::cout << "This test is bullshit" << std::endl;

        else if (sizeof(Money) == sizeof(char))
        {
            std::cout << "It's a char. Global scope is what matters" << std::endl;
        }
        else if (sizeof(Money) == sizeof(long))
        {
            std::cout << "It's a long. Inner scope is what matters" << std::endl;
        }
    }

    private:
        typedef long Money;
};

int main()
{
  Person p;

  p.checkType();

  system("pause");

  return 0;
}

そして答えは....長いです!(とにかくVS2012では)

于 2013-08-10T09:17:06.843 に答える