请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用

See reference to function template instantiation message when catch std::exception in Visual Studio 2019

我在 Visual Studio 2019 年构建 C++ 控制台应用程序期间注意到一条恼人的消息,Windows 10。我有一个生成消息的模板函数:

message : see reference to function template instantiation 'int run_loop<wchar_t>(int,const char_type *[])' being compiled
    with
    [
        char_type=wchar_t
    ]

类似的代码编译正常,在 macOS 和 Ubuntu 上没有消息,但现在我将它移植到 Windwos 并看到这个。这不是错误或警告,只是一条信息消息。我开始注释掉函数内部的代码块,发现当我注释掉 std::exception 时,捕获消息消失了。此消息是什么意思,我应该如何处理?保持原样还是我应该以其他方式重新设计我的代码?以下是生成上述消息的简化代码片段:

#include <exception>

template<class char_type>
int run_loop(int argc, const char_type* argv[])
{
    try
    {
    }
    catch (const std::exception& ex)
    {
    }

    return 0;
}

int wmain(int argc, const wchar_t* argv[])
{
    return run_loop(argc, argv);
}

我的环境:

OS:Windows 10 Pro x64 版本 1909 OS 内部版本 18363.836

IDE: Visual Studio 2019 版本 16.6.0

具有默认设置的 C++ 中的 Win32 控制台应用程序模板:

Windows SDK 版本:10.0

平台工具集:Visual Studio 2019 (v142)

此编译器消息并不代表其自身,它伴随着另一条消息。鉴于您的代码,完整的输出是

warning C4100: 'argv': unreferenced formal parameter
message : see reference to function template instantiation 'int run_loop(int,const char_type *[])' being compiled
with
[
char_type=wchar_t
]

所以主要信息是argv是一个未引用的形式参数的警告。编译器通过消息如何实例化模板为您提供额外的提示。如果您有一个模板的多个实例化并且警告仅在某些实例化时出现,这会很有用。

顺便说一句,修复该警告后,您仍然会收到相同的消息,因为 argcex 也未使用。删除所有三个名称或使用它们后,您不会再收到警告和消息。