Skip to content

起因

这问题倒不是来自卢瑟帝国,而是别的群聊,国王也决定稍微收录一下。

就是一位群友在群里说:

catch 里面竟然可以用 auto 那和 ... 有啥区别

另一位群友回答:

函数参数也能用 auto 和三点 大概是类似的区别

国王:

我说了两件事情:

  1. 不管是函数,还是 catch 中,... 和 auto 不一样,差很远。
  2. catch 中使用 auto,我闻所未闻,那就不会是标准有的,个人认为得是编译器扩展。

msvc 可以通过编译,但是也没办法正常接取异常,msvc 的标准文档也没提这玩意。

测试代码:

cpp
int main()
{
    try
    {
        throw 1;
    }
    catch (auto)
    {
        
    }
}

gcc 和 clang 都无法通过编译,实测我的 msvc 可以,但是它也没有办法接取这个异常,只是能通过编译而已,在运行时依旧会抛出异常。

抛出异常

显然作用和 ... 不一样。

咨询其他群友,意思很简单:

既然能通过编译,那试试打印类型。

打印类型

如果使用它,则无法通过编译,这种行为其实很像一个 bug。根本没初始化。没看出有什么意义和作用。

可以看看愚蠢的 GPT 的说法,因为这个问题就是 GPT 搞出来的。

GPT 回答

没有什么意义,按照它那样来

cpp
#include <exception>
#include <iostream>

int main()
{
    try
    {
        throw std::runtime_error("乐");
    }
    catch (auto& e)
    {
        std::cout << typeid(e).name();
    }
}

一样是编译错误。

总结

暂时没啥结果,这种没有使用意义,应该不会是编译器扩展,可能就是个 bug[1]


  1. Invalid catch(auto) syntax is accepted - Developer Community ↩︎