【发布时间】:2012-12-31 10:11:35
【问题描述】:
我试图写一个既可以用作前缀又可以用作后缀运算符的运算符
#include <iostream>
#include <utility>
struct B {
// ...
};
template<typename ...T>
void operator++(B, T...) {
std::cout << ((sizeof...(T) == 0) ? "prefix" : "postfix") << std::endl;
}
int main() {
B b;
b++;
++b;
}
GCC 可以编译并正常工作,但是 clang 说
main.cpp:9:24: 错误:重载后自增运算符的参数必须为“int”类型(不是“T...”)
void operator++(B, T...) {
谁是对的?
感谢任何帮助我了解 GCC 行为的人。我提交了一份新的 Clang 错误报告:
【问题讨论】:
-
我不确定这是否可行 - 措辞是“具有两个参数的非成员函数(第二个应为 int 类型)......”
-
这是 clang 存在的理由。如果您编写 stoopid 代码,则 clang 保留通过明确的错误消息告诉您的权利。好的错误信息胜过粗制滥造的语言标准,这种观点还没有得到足够的应用。令人钦佩的错误,也许,我确实喜欢他们正在尝试做的事情。不要把贵宾犬放在微波炉里。
-
但关键是可以为函数生成有效的特化(不需要参数包始终为空(这是非法的))。
-
@Hans 称 C++ 语言标准为“粗制滥造”缺乏远见。很少有(少于五个?我能说出一个)具有更严格的语言和定义的语言标准。
-
@KonradRudolph 出于好奇,你能想到的那个是什么?
标签: c++ templates c++11 operators language-lawyer