このページでは

QScopeGuard Class

template <typename F> class QScopeGuard

スコープの末尾で関数を呼び出す際のスコープガードを提供します。詳細...

ヘッダー: #include <QScopeGuard>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

パブリック関数

QScopeGuard(F &&f)
QScopeGuard(const F &f)
(since 6.11) void commit()
void dismiss()
QScopeGuard<typename std::decay<F>::type> qScopeGuard(F &&f)

詳細な説明

QScopeGuard<F> はテンプレートクラスであり、F は、デストラクタ内で呼び出される呼び出し可能オブジェクト(関数ポインタ、ファンクタ、ラムダなど)の型です。 これは、関数が正常に終了した場合、return 文によって早期に終了した場合、あるいは例外によって終了した場合のいずれであっても、クリーンアップコードが確実に実行されるようにするために役立ちます。

スコープガードは、dismiss() を使用して無効化することができます。この場合、関数はまったく実行されません。また、commit() を使用すると、破棄の前に実行されます。

注:例外は サポートされていません。呼び出し可能オブジェクトは、実行時、コピー時、または移動時に例外をスローしてはなりません。

QScopedValueRollbackも参照してください 。

メンバ関数のドキュメント

[explicit noexcept] QScopeGuard::QScopeGuard(F &&f)

[explicit noexcept] QScopeGuard::QScopeGuard(const F &f)

スコープの終了時に `f ` を実行するスコープガードを作成します。

Fがラムダ式の場合、その型を記述することはできません。その場合は、クラステンプレートの引数推論(C++17 の機能)を利用してテンプレートパラメータを完全に省略するか、このコンストラクタの代わりにヘルパー関数 `qScopeGuard()` を使用する必要があります。

[noexcept(...), since 6.11] void QScopeGuard::commit()

関数Fを呼び出し、その後スコープガードを解除します。この関数を呼び出す際、ガードは有効な状態(dismiss() が呼び出されていない状態)でなければなりません。

この関数は Qt 6.11 で導入されました。

注: std::is_nothrow_invocable_v<F> がtrue の場合、この関数はnoexceptとなります 。

dismiss()も参照してください 。

[noexcept] void QScopeGuard::dismiss()

スコープガードを無効化し、スコープの終了時に関数Fが呼び出されないようにします。

commit()も参照してください 。

関連する非メンバー関数

template <typename F> QScopeGuard<typename std::decay<F>::type> qScopeGuard(F &&f)

qScopeGuard 関数を使用すると、スコープの終了時に関数を呼び出すことができます。

スコープの終了時に `f ` を実行するスコープガードを作成します。

このヘルパー関数は、呼び出し可能な関数の型に対するテンプレートパラメータに名前を付ける必要なく、QScopeGuard を簡単に構築できるように提供されています。Fがラムダ式である場合、その型を記述することはできず、このヘルパー関数またはクラステンプレートの引数推論を利用する必要があります。

使用例は以下の通りです:

void myComplexCodeWithMultipleReturnPoints(int v)
{
    // The lambda will be executed right before your function returns
    auto cleanup = qScopeGuard([] { /* code you want executed goes HERE; */ });

    if (v == -1)
        return;

    int v2 = code_that_might_throw_exceptions();

    if (v2 == -1)
        return;

    //...
}

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.