【问题标题】:What is the class keyword before a function argument?函数参数前的 class 关键字是什么?
【发布时间】:2016-03-12 15:17:12
【问题描述】:

为什么这段代码有效?看到 f 函数参数前面的 class 关键字了吗?如果我添加它会发生什么变化?

struct A
{
    int i;
};

void f(class A pA) // why 'class' here?
{
    cout << pA.i << endl;
}

int main() 
{
    A obj{7};
    f(obj);
    return 0;
}

【问题讨论】:

    标签: c++ c++11


    【解决方案1】:

    如果作用域中存在名称与类类型名称相同的函数或变量,则可以在名称前添加类以消除歧义,从而产生elaborated type specifier

    您始终可以使用详细的类型说明符。然而,它的主要用例是当你有一个同名的函数或变量时。

    来自 cppreference.com 的示例:

    class T {
    public:
        class U;
    private:
        int U;
    };
    
    int main()
    {
        int T;
        T t; // error: the local variable T is found
        class T t; // OK: finds ::T, the local variable T is ignored
        T::U* u; // error: lookup of T::U finds the private data member
        class T::U* u; // OK: the data member is ignored
    }
    

    【讨论】:

    • 所以这里的classtypename 是一样的?
    • @Narek:不。尝试在这个例子(或你的例子)中使用typename,你会发现它失败了。
    • 这个答案的措辞略有错误。您总是允许使用详细的类型说明符。然而,它的主要用例是当你有一个同名的函数或变量时。
    • @Christian Hackl;强调的好点。我已经进行了相应的更新。
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 2018-10-29
    • 1970-01-01
    • 2018-01-23
    • 2012-09-29
    • 1970-01-01
    相关资源
    最近更新 更多