代码之家  ›  专栏  ›  技术社区  ›  Mario

叮当错误编译器错误或遗漏一些细节?

  •  6
  • Mario  · 技术社区  · 6 年前

    在尝试使用可变模板、初始值设定项列表等时,我意外地发现了下面的无意义代码,从而触发了一个相当有趣的错误消息。

    首先,让我们定义一个小类,用重载进行测试 operator,() :

    class Dummy {
    public:
        Dummy() {}
        Dummy &operator,(int) { return *this; }
    };
    

    int test1 = (Dummy{}, 0);
    

    编译时使用 clang version 6.0.0 (tags/RELEASE_600/final 334239) 这会触发一个非常合理的错误消息(因为操作员实际上会剥离 0 从后面看):

    错误:无法从“Dummy”转换为“int”

    int test2 { (Dummy{}, 0) };
    

    据我所知,这基本上应该会触发相同的信息,因为最终我们要做的是同样的事情。但是,错误是不同的:

    大问题: void 这里有一个错误,还是有一些转换或解释发生了,我只是错过了?

    Code snippet on Compiler Explorer

    1 回复  |  直到 6 年前
        1
  •  2
  •   catnip    6 年前

    看起来像个虫子,试试看 this this .