在尝试使用可变参数模板,初始化程序列表等时,我偶然发现了以下无意义的代码,触发了一条相当有趣的错误消息。
首先,让我们定义一个小类,以便在重载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'到' int'
大问题:void
这里有一个错误,或者是否有一些转换或解释发生,我只是错过了?