へのポインタメンバ関数を呼び出した後、このMWEが不自然見えるかもしれませんが、失敗static_assertはそれにもかかわらず、驚くべきことである失敗しますオペラのnoexceptの文脈では、 "これ"とは違った扱いがあるため、GCCではなくClangである。noexcept演算子は
4
A
答えて
7
static_assert
には文字列引数がないので、C++ 17を使用しています。 C++ 17ではnoexcept
が型システムの一部となりました。これが意味することは与えられたということです。
using F = void(C::*)();
このPMFはnoexcept
ではありません。それを呼び出すことは、メンバー関数noexcept(false)
を呼び出すのと同じです。あなたはnoexcept
として機能タイプをマークする必要があります。
using F = void(C::*)() noexcept;
変更は、あなたのコードがコンパイルできること:
#include <utility>
struct C {
void f() noexcept { }
using F = void(C::*)() noexcept;
static constexpr F handler() noexcept {
return &C::f;
}
void g() noexcept(noexcept((this->*handler())())) {
}
};
int main() {
static_assert(noexcept(std::declval<C>().g()));
}
3
f
はnoexcept
ですが、それへのポインタではありません。したがって、g
の定義では、this->*handler()
はnoexcept
ではないPMFを返します(がnoexcept
のMFのアドレスを返しても、(this->*handler())()
と書くと、そうでない関数が呼び出されます) noexcept
は、noexcept
句のでfalse
が返されます。
をライン5の最後にnoexcept
を追加し、それが動作します。
関連する問題
- 1. 奇妙な演算子オーバーロード、 "演算子T&()constはnoexcept {* _ptrを返す;}"
- 2. は、Invoke演算子&演算子はKotlin
- 3. 演算子( - - )()演算子C#
- 4. 演算子if演算子
- 5. C++演算子()括弧 - 演算子Type()vs型演算子()
- 6. 「演算子は[]」
- 7. * =演算子は
- 8. 演算子のオーバーロード演算
- 9. C++演算子+演算子+ =オーバーロード
- 10. XOR演算子とstd :: ostream演算子
- 11. Xval演算子と比較演算子?
- 12. 共有ポインタ[]演算子と++演算子
- 13. Pythonのビット演算子 '&' 演算子
- 14. C++:演算子オーバーロード、演算子+
- 15. Java演算子 - > how ==演算子
- 16. 演算子は= C++
- 17. PostgreSQLは演算子
- 18. は、ビット演算子
- 19. Cプログラミング!算術演算子演算
- 20. ":"演算子は代入演算子 "="と同等ですか?
- 21. C++の代入演算子または増分演算子
- 22. ||演算子は=演算子と同じですか?
- 23. オーバーロード比較です演算子「無効な演算子は、<」
- 24. または演算子対3項演算子
- 25. ポストインクリメント演算子++
- 26. オーバーロード演算子+
- 27. バイナリオーバーロード演算子=
- 28. PostgreSQL '%'演算子
- 29. モジュロ演算子
- 30. オーバーロードテンプレート演算子*
は、あなたの質問は何ですか? – aschepler
の答えの一つは、あなたの質問に答えた場合、あなたはそれを受け入れることができます。場合どちらもあなたの質問に答えなかったのですが、私たちが答えを改善できるように理由を説明できますか? – Justin
長い間遅れて申し訳ありません。私は答えに満足していませんでしたが、私は彼らが言い表されたように質問に答えるので、私は1つを受け入れるでしょう。しかし、私の場合、 "f"はライブラリのユーザが渡すテンプレートパラメータなので、関数型のnoexcept-nessを問い合わせて、メンバ関数へのポインタのnoexcept指定子を適切に宣言する必要があります。残念ながら、型エイリアスにnoexceptを追加しても、Fのエイリアスがテンプレート化されてコンパイルされないため、内部コンパイラエラーが発生します。私はこれについてClangのバグを投稿します。 – Jackie