最近我一直在嘗試C++概念。我從以下範圍擴展文件試圖定義:C++概念相同並可賦值
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/n4569.pdf
的定義和用途Same
是困惑我。由於我未知的原因,作者沒有給出明確的定義。所以我使用:
template <class T, class U>
concept bool Same()
{
return std::is_same<T, U>::value;
}
的問題是,該文件給出了Assignable
定義如下:
template <class T, class U>
concept bool Assignable()
{
return Common<T, U>() && requires(T&& a, U&& b) {
{ std::forward<T>(a) = std::forward<U>(b) } -> Same<T&>;
};
}
它不工作(GCC 6.3下):一個簡單的Assignable<int&, int&&>()
概念支票給我false
(我已經驗證Common
部分是確定的)。我必須將Same<T&>
更改爲T&
才能使其看似工作。在其他一些地方也使用相同的Same<Type>
檢查。
我的問題是:
- 是我的
Same
定義是否正確? - 爲什麼使用
Same<T&>
代替T&
?有什麼區別?
感謝您的幫助。
「Same」的定義有點微妙:範圍TS要求實現將約束'Same()'視爲等同於'Same ()'。這是不可能的,任何簡單的定義。它不能用語言表達,並且有效地要求通過編譯器內在實現'Same'。 –
Casey
對於'Assignable'中例舉的問題的評估,您是完全正確的:當我實現cmcstl2時,GCC中的演繹約束被破壞,並且在開發幾乎等價的解決方法語法時巧妙地誤解了語義。因此,直到最近我們才意識到TS中的概念定義已被打破。 – Casey
@Casey我實際上會認爲你的bug更多的是當前概念提案的失敗。使用'相同的 &&'看起來很醜並且不直觀。 –