考虑以下结构(?):空隙(),逗号运算符(操作员)和不可能超载
struct S {};
在C++ 14中,定义以下是有效的:
constexpr auto f() { return S{}, 'c'; }
除了下列之一:
constexpr auto f() { return S{}, void(); }
现在,考虑到涉及第一两种定义的下面,工作片断:
#include<type_traits>
struct S {};
constexpr int operator,(S, char) { return 42; }
constexpr auto f() { return S{}, 'c'; }
int main() {
constexpr int i{f()};
static_assert(i == 42, "!");
static_assert(std::is_same<decltype(f()), int>::value, "!");
}
说起不那么技术上,逗号运算拦截夫妇S{}, 'c'
并返回一个整数的过载,如main
功能正确验证。
现在,假设我希望做同样与f
第二个定义:
constexpr auto f() { return S{}, void(); }
在这种情况下,逗号操作符应该拦截形式S{}, void()
。
无论如下定义作品(原因很明显):
constexpr int operator,(S, void) { return 42; }
也不下一个(这将在前面的情况下工作过):
template<typename T> constexpr int operator,(S, T &&) { return 42; }
有什么办法重载逗号运营商如何处理S{}, void()
?
是不是它在标准中缺乏,因为它允许以这种方式使用逗号运算符,但不会给您重载相同运算符的机会(即使the standard mentions that overloaded functions involving S
are allowed)?
注意:这个问题对我的好奇心起见。请避免像这样的意见不要那样做或这是不好的做法。我不打算在生产环境中这样做。谢谢。
这很吸引人疯狂;) –
@JesperJuhl是的,我知道。标准游击队员。我正在探索语言中最隐蔽的角落。 :-) – skypjack
将运算符','改成'+'给出一个“参数可能没有'void'type”错误。 – kennytm