5

C ++ 11のunique_lock コンストラクターの中には、フラグのようないくつかのクラスを渡すことができるものがあります。

auto lock = std::unique_lock<std::mutex> lock(m, std::defer_lock);

ここで、std::defer_lockは次のように定義されます

struct defer_lock {}

列挙型ではなく、なぜこのように行われるのですか?

これを小さなコードサンプルに適用しようとしましたが、コンパイルできませんでした。

class A {};
void foo(A a) {}

int main() {
  foo(A); // error: 'A' does not refer to a value
}

かっこをfoo(A());うまく機能するように配置すると、STLとの違いがわかりません。なぜこれがそこで異なった振る舞いをするのですか?

4

3 に答える 3

9

別のタイプを使用して特定の操作をマークするのではなく、enumコードパスを選択すると、実行時の選択ではなくコンパイル時の選択が行われます。さまざまな関数の実装も大幅に異なる可能性があります。

于 2012-11-10T23:42:30.787 に答える
5

実際にstd::defer_lockは、あなたが書くように定義されていませんが、

constexpr std::defer_lock_t defer_lock = std::defer_lock_t();

そのため、お使いのバージョンは(ひどく)標準ライブラリ定義を「模倣」していません。定義をたとえばに変更します。

struct A {} A;

そしてそれは動作します。(または、もう少し魅力的なものを試してくださいstruct A_t {} A

于 2012-11-10T23:41:48.073 に答える
4

標準ライブラリの実際のコードは

struct defer_lock_t {};
constexpr defer_lock_t defer_lock {};

最初の行は、メンバーのないクラスを定義しています。2行目は、そのタイプのオブジェクトを定義しています。オブジェクトは関数呼び出しで使用されます。

于 2012-11-10T23:43:27.180 に答える