在 main 中可见的函数中声明的 C++ 结构

标签 c++ c++14

为什么这段代码有效?使用 c++14

// Example program
#include <iostream>
#include <string>
using namespace std;


auto fun()
{
    struct a
    {
        int num = 10;
        a()
        {

            cout << "a made\n";
        }
        ~a()
        {
            cout << "a destroyed\n";
        }
    };
    static a a_obj;
    return a_obj;
}


int main()
{
    auto x = fun();
    cout << x.num << endl;

}

a 类型如何在 main 中可见?如果我将 auto x= 更改为 a x= 它显然不会编译,但是 main 如何知道 a 类型?

static 声明在那里,因为我试图测试其他东西,但后来我偶然发现了这种行为。

在这里运行:https://wandbox.org/permlink/rEZipLVpcZt7zm4j

最佳答案

在您意识到这一点之前,这一切都是令人惊讶的:name 可见性不会隐藏类型。它只是隐藏类型的名称。一旦理解了这一点,一切就都说得通了。

我可以在没有 auto 的情况下向您展示这个,只使用普通的旧模板:

auto fun()
{
    struct Hidden { int a; };

    return Hidden{24};
}

template <class T> auto fun2(T param)
{
    cout << param.a << endl; // OK
} 

auto test()
{
    fun2(fun()); // OK
}

如果仔细观察,您会发现这与您的情况相同:

你有一个 Hidden 结构,它是 fun 的本地结构。然后你在 test 中使用一个 Hidden 类型的对象:你调用 fun 返回一个 Hidden obj 然后你将此对象传递给 fun2,而 fun2 可以毫无问题地使用对象 Hidden

正如@Barry 所建议的,当您从类中返回一个私有(private)类型的实例时,同样的事情也会发生。所以我们从 C++03 开始​​就有了这种行为。你可以自己试试。

关于在 main 中可见的函数中声明的 C++ 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45738036/

相关文章:

c++ - 使用 C++ 中的对象字段数据在 Visual Studio 2013 中创建图表

c++ - 保存文件中的更改

c++ - 如果模板参数是另一个模板的某个实例,则类型特征测试

c++ - Derive* 调用调用虚函数的非虚 Base 函数 - 强制静态解析

c++ - 使用 make_unique 语句重新分配 unique_ptr 对象 - 内存泄漏?

c++ - 让 FreeImage 与 Visual Studio 2010 配合使用

c++ - 类型组的模板类的成员特化?

c++ - 编译opencv程序导致gcc -I/usr/local/lib test.cpp test.cpp :1:10: fatal error: opencv2/core. hpp: No such file or directory

c++ - std::shared_timed_mutex 上的共享锁可以升级为独占锁吗?

c++ - 无法从通用引用中捕获 lambda 中的引用?