考慮以下結構(?):空隙(),逗號運算符(操作員)和不可能超載
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