クラスオブジェクトを左辺値のみとして作成できますか?

Tootsie

std::lock_guard(およびその親戚)に関するよく知られた問題は、一時オブジェクトのみが作成された場合に期待どおりに機能しないことです。

例えば:

std::mutex mtx;

std::lock_guard<std::mutex> {mtx} // temporary object, does not lock the entire scope

std::lock_guard<std::mutex> lck{mtx} // correct

参照修飾子を試して、(コンパイル時に)一時オブジェクトが作成されないようにする置換を作成しました。次のコードは無駄な試みです。

#include <mutex>

template<typename T>
struct my_lock {
    T &mtx;
    my_lock(T &t) : mtx{t} { lock(); }
    ~my_lock() { unlock(); }

    void lock() & { mtx.lock(); };
    void unlock() & { mtx.unlock(); };
};


std::mutex mtx;

int main()
{
    my_lock<std::mutex> {mtx}; // A 

    my_lock<std::mutex lck{mtx}; // B
}

これは機能しないため、質問は次のようになります。

コンパイラが拒否Aして受け入れるような方法でクラスを作成することは可能Bですか?

アップルアップル

を使用c++17できる場合[[nodiscard]]は、ファクトリ関数で属性を使用できます


class [[nodiscard]] my_lock{
   my_lock()=default;
   friend my_lock lock();
};
[[nodiscard]] my_lock lock(){return {};}

int main(){
    { lock(); } //warning for discard return value
    { auto l = lock();}
}

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

メンバー関数は、右辺値オブジェクトへの変更可能な左辺値参照を返すことができますか?

分類Dev

C ++関数オブジェクトを左辺値および/または右辺値として渡す

分類Dev

const左辺値を介して非constオブジェクトにアクセスするのは安全ですか?

分類Dev

もともとサブクラスオブジェクトとして作成されたオブジェクトを別のサブクラスオブジェクトに変更することはできますか?

分類Dev

内部クラスを静的として宣言し、周囲のクラスにオブジェクトを作成せずにアクセスできますか?

分類Dev

C ++:クラスを別のクラスのオブジェクトとして使用できますか?

分類Dev

クラスは、クラスオブジェクトをキーとして、値としてそのクラスのオブジェクトのリストを持つマップ属性を持つことができますか?

分類Dev

オブジェクトの基本クラスの関数を取得できますか?インターフェイスとして作成されます

分類Dev

`...`を使用して既存のオブジェクトから新しいオブジェクトを作成するときのエラー:この環境では、割り当てのソースはオブジェクトでなければなりません

分類Dev

そのオブジェクトを作成することはできませんクラスを作成します。

分類Dev

C ++左辺値オブジェクトを右辺値参照(&&)にバインドできないのはなぜですか?

分類Dev

元のスタックとスタックフレームを使用してエラーオブジェクトを再作成できますか?

分類Dev

右辺値をそのオブジェクトに割り当てると、クラスのポインター メンバーはどうなりますか?

分類Dev

オブジェクト内にオブジェクトを作成してからネストされたオブジェクトに追加すると、コンソールはそれに追加された値ではなく「オブジェクト」のみを返します

分類Dev

オブジェクトの右辺値バージョンの関数を削除できますか?

分類Dev

Javaクラスをオブジェクトにして、オブジェクトをクラスにすることはできますか?

分類Dev

Javaクラスをオブジェクトにして、オブジェクトをクラスにすることはできますか?

分類Dev

オブジェクトのタイプのみから空の値を使用してJSONの例を作成できますか?

分類Dev

基本クラスとしてオブジェクトを持たないクラス構造を作成できますか

分類Dev

単純なオブジェクトクラスを拡張してRoomデータベースオブジェクトを作成できますか?

分類Dev

このオブジェクトの他の値にアクセスして、オブジェクトの値を設定できますか?

分類Dev

目的C:辞書エラーからjsonオブジェクトを作成する。辞書の値は文字列のみにすることができます

分類Dev

基本クラスのコンストラクターを呼び出して、派生オブジェクトを作成できますか?

分類Dev

作成したクラスのオブジェクトをQTextBrowserに表示できる関数はありますか?

分類Dev

新しいオブジェクトの作成中にクラス名を変更できますか?

分類Dev

エラー:タイプ 'constchar'の戻りオブジェクトをタイプ 'const char [34]'の左辺値で初期化できません

分類Dev

オブジェクト型を返すクラスですが、どのように null を返してチェックすることができますか

分類Dev

BASH環境でオブジェクトのリストを作成して操作できますか

分類Dev

ラムダクロージャの左辺値は、右辺値の参照パラメーターとして渡すことができます

Related 関連記事

  1. 1

    メンバー関数は、右辺値オブジェクトへの変更可能な左辺値参照を返すことができますか?

  2. 2

    C ++関数オブジェクトを左辺値および/または右辺値として渡す

  3. 3

    const左辺値を介して非constオブジェクトにアクセスするのは安全ですか?

  4. 4

    もともとサブクラスオブジェクトとして作成されたオブジェクトを別のサブクラスオブジェクトに変更することはできますか?

  5. 5

    内部クラスを静的として宣言し、周囲のクラスにオブジェクトを作成せずにアクセスできますか?

  6. 6

    C ++:クラスを別のクラスのオブジェクトとして使用できますか?

  7. 7

    クラスは、クラスオブジェクトをキーとして、値としてそのクラスのオブジェクトのリストを持つマップ属性を持つことができますか?

  8. 8

    オブジェクトの基本クラスの関数を取得できますか?インターフェイスとして作成されます

  9. 9

    `...`を使用して既存のオブジェクトから新しいオブジェクトを作成するときのエラー:この環境では、割り当てのソースはオブジェクトでなければなりません

  10. 10

    そのオブジェクトを作成することはできませんクラスを作成します。

  11. 11

    C ++左辺値オブジェクトを右辺値参照(&&)にバインドできないのはなぜですか?

  12. 12

    元のスタックとスタックフレームを使用してエラーオブジェクトを再作成できますか?

  13. 13

    右辺値をそのオブジェクトに割り当てると、クラスのポインター メンバーはどうなりますか?

  14. 14

    オブジェクト内にオブジェクトを作成してからネストされたオブジェクトに追加すると、コンソールはそれに追加された値ではなく「オブジェクト」のみを返します

  15. 15

    オブジェクトの右辺値バージョンの関数を削除できますか?

  16. 16

    Javaクラスをオブジェクトにして、オブジェクトをクラスにすることはできますか?

  17. 17

    Javaクラスをオブジェクトにして、オブジェクトをクラスにすることはできますか?

  18. 18

    オブジェクトのタイプのみから空の値を使用してJSONの例を作成できますか?

  19. 19

    基本クラスとしてオブジェクトを持たないクラス構造を作成できますか

  20. 20

    単純なオブジェクトクラスを拡張してRoomデータベースオブジェクトを作成できますか?

  21. 21

    このオブジェクトの他の値にアクセスして、オブジェクトの値を設定できますか?

  22. 22

    目的C:辞書エラーからjsonオブジェクトを作成する。辞書の値は文字列のみにすることができます

  23. 23

    基本クラスのコンストラクターを呼び出して、派生オブジェクトを作成できますか?

  24. 24

    作成したクラスのオブジェクトをQTextBrowserに表示できる関数はありますか?

  25. 25

    新しいオブジェクトの作成中にクラス名を変更できますか?

  26. 26

    エラー:タイプ 'constchar'の戻りオブジェクトをタイプ 'const char [34]'の左辺値で初期化できません

  27. 27

    オブジェクト型を返すクラスですが、どのように null を返してチェックすることができますか

  28. 28

    BASH環境でオブジェクトのリストを作成して操作できますか

  29. 29

    ラムダクロージャの左辺値は、右辺値の参照パラメーターとして渡すことができます

ホットタグ

アーカイブ