0

我的代码是:

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

我定义了这个类,我想知道a:doublelong 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;
};

所以类型along double

4

5 回答 5

3

在标准中说:

7.1.3 typedef 说明符 [dcl.typedef ]

在给定的范围内,不应使用 typedef 说明符重新定义在该范围内声明的任何类型的名称以引用不同的类型。

这意味着 C++ 要求Money它在第一次看到并随后重新评估时必须是相同的类型。

您的程序无效,因为第一次Money评估它是类型double,而当它重新评估它是类型long double......所有在类范围内......

get()例如,如果您删除您的功能,Money则将long double在您声明时进行评估a


从评论中,我试图解释更多我的意思:

实际上,这两个 typedef 是在不同的范围内定义的。Money但是在(对于get()定义)的第一次评估期间double,由于 typedef 在全局范围内完成,它的类型是 。

稍后,使用第二个 typedef,我们重新定义Money为 type long double

在这里,我们试图在相同的范围(类范围)中重新定义之前声明的类型。


似乎 Visual Studio 2010 和 2012 都可以。

我用 g++ 4.2.1 和 4.8.1 对其进行了测试,我收到了这个错误:

error: declaration of ‘typedef long double Person::Money’
error: changes meaning of ‘Money’ from ‘typedef double Money’
于 2013-08-10T09:12:04.320 回答
1

这是无效的 C++ 代码,因此无法回答您的问题。C++ 要求当Money第一次出现时,以及Money后来重新计算时,在这两种情况下都是相同的类型。GCC 会为此生成一个硬错误。其他编译器可能会接受它,但如果他们接受,标准并没有说明使用哪个 typedef。

如果删除get()函数,则类型为ais long double,因为本地 typedef 会影响全局类型。在这种情况下,本地 typedef 出现在Money使用之前,并且没有问题。

于 2013-08-10T09:00:07.003 回答
0

我相信在这种情况下标准的适用部分是§3.3.7/1:2 和 3:

2) 在类 S 中使用的名称 N 应在其上下文中引用相同的声明,并且在 S 的完整范围内重新评估时。对于违反本规则的情况不需要诊断。

3) 如果在一个类中重新排序成员声明产生了一个在 (1) 和 (2) 下的替代有效程序,该程序是非良构的,不需要诊断。

在定义的返回类型的上下文中Money使用的名称是指,但是当在完成的范围内重新评估时。PersonPerson::get::MoneyPerson::Person::Money

同样,对成员声明重新排序,使typedefof 位于 ofPerson::Money之前,会Person::get产生一个替代的有效程序。

因此,您的代码似乎格式错误,但由于不需要诊断,因此 VC++ 和 gcc 在这方面同样符合要求。我当然更喜欢诊断违规行为(如 gcc 所做的那样),而不是默默接受(如 VC++ 所做的那样)。

于 2013-08-10T10:12:12.260 回答
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 回答
0

线

typedef long double Money;

是赠品

iea是类型Money并且Moneylong double

于 2013-08-10T08:59:40.167 回答