constメンバー関数のメンバー変数のタイプ

ブレアデビッドソン

constとしてマークされたメンバー関数があり、メンバー変数のタイプを調べると、予期しない結果が得られます。

#include <iostream>
#include <string>

template<typename T>
struct type_printer;

class const_type_test {
public:
    void test() const {
        type_printer<decltype(value)> _;
    }
    int& test2() const {
        return value;
    }
    void test3() const {
        auto& x = value;
        type_printer<decltype(x)> _;
    }
    void test4() const {
        auto* x = &value;
        type_printer<decltype(*x)> _;
    }
private:
    int value;
};

int main(int argc, char** argv) 
{
    const const_type_test x;

    return 0;
}

私の理解では、constメソッドを使用している場合、メソッドは事実上名前がマングルされた名前であり、パラメーターの型はclassname const * constです。constメソッドのスコープでは、メンバー変数は事実上constである、つまり値はconstintになるといつも思っていました。ただし、コンパイラエラーを使用して型を推測すると、予期しない型が取得されます。

void const_type_test::test() const:aggregateのエラー出力type_printer<int> _は不完全な型であり、定義できません。type_printer<decltype(value)> _;

したがって、型がintとして推定されたことがわかります。値を変更できないので、constintになると思いました。decltypeを間違って使用していますか?または私は私の理解に穴があります。

私が尋ねる理由はtest2、コンパイラーで文句を言うint&からconst intです。型の参照をバインドして修飾子破棄します。それはまさに私が期待していることです。const参照をnonconst参照にバインドできます。

例3は、次のエラーを示しています。エラー:集計のtype_printer<const int&> _型が不完全であり、定義できませんtype_printer<decltype(x)> _これは、const参照として推定されていると私が期待していることです。

例4:type_printer<const int&>私がポインタだと思っものも推測します。

私の知識の穴がどこにあるかを見つけるために、標準への参照を取得することに熱心です。また、使用時に奇妙なタイプの演繹ルールがあり、decltypeそれが私をつまずかせているのではないかと思います。

シャシャンクV

decltypeクラスのメンバーには特別なルールがあります。メンバーの実際のタイプを返します。あなたがしたい場合decltype(のconst関数内)コンテキストを考慮することが、あなたは括弧内の式をラップすることができます。

パランテシスなし:

 void test() const {
        type_printer<decltype(value)> _;
    }
c.cpp:10:39: error: implicit instantiation of undefined template 'type_printer<int>'
        type_printer<decltype(value)> _;

パランテシスあり:

 void test() const {
        type_printer<decltype((value))> _;
    }

c.cpp:10:41: error: implicit instantiation of undefined template 'type_printer<const int &>'
        type_printer<decltype((value))> _;

参照:

https://en.cppreference.com/w/cpp/language/decltype

引数が括弧で囲まれていないid式または括弧で囲まれていないクラスメンバーアクセス式である場合、decltypeはこの式で指定されたエンティティの型を生成します。そのようなエンティティがない場合、または引数がオーバーロードされた関数のセットを指定している場合、プログラムの形式は正しくありません。

https://docs.microsoft.com/en-us/cpp/cpp/decltype-cpp?view=vs-2019

式パラメーターが識別子またはクラスメンバーアクセスの場合、decltype(expression)は式で指定されたエンティティのタイプです。そのようなエンティティがない場合、または式パラメータがオーバーロードされた関数のセットを指定している場合、コンパイラはエラーメッセージを生成します。

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

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

編集
0

コメントを追加

0

関連記事

分類Dev

C ++のconstメンバー関数での静的メンバーの変更

分類Dev

メンバー関数の引数のタイプ

分類Dev

メンバー関数の静的変数

分類Dev

メンバー関数の静的変数

分類Dev

Constメンバー関数

分類Dev

C ++:constメンバー関数から非constポインターパラメーターを受け取る外部関数にポインター値のメンバー変数を渡すことができるのはなぜですか?

分類Dev

ヘッダーのプライベート静的constメンバー変数とcppのconst変数

分類Dev

constメンバー関数からクラスメンバーへのポインタを返す

分類Dev

この関数とメンバー関数のconst-correctness

分類Dev

テンプレートコンテナのconst関数のメンバー変数を変更するコンパイラエラー

分類Dev

テンプレートでのメンバー関数ポインターの変換

分類Dev

constメンバー関数から非constメンバー関数ポインターを呼び出す

分類Dev

インスタンスメンバーのプロパティへのメンバー関数の割り当て

分類Dev

テンプレートとメンバー関数へのポインター

分類Dev

constメンバー変数を介したインライン関数へのアクセス

分類Dev

メンバーへのポインターが参照する関数タイプ

分類Dev

非テンプレートメンバー関数ポインターへのテンプレートメンバー関数ポインター

分類Dev

メンバー関数エラーへのポインター

分類Dev

関数ポインターメンバー変数

分類Dev

インターフェースの属性/メンバー変数?

分類Dev

メンバー関数ポインターからのQMetaMethod

分類Dev

C ++メンバー関数ポインターの定義

分類Dev

メンバー関数へのポインター

分類Dev

関数メンバーへのポインター

分類Dev

メンバー関数構文へのポインター

分類Dev

メンバー関数へのポインター

分類Dev

派生クラスのメンバー関数ポインター

分類Dev

メンバー関数へのポインター-構文

分類Dev

配列のインデックスとなるメンバー関数間でconst変数を渡す

Related 関連記事

  1. 1

    C ++のconstメンバー関数での静的メンバーの変更

  2. 2

    メンバー関数の引数のタイプ

  3. 3

    メンバー関数の静的変数

  4. 4

    メンバー関数の静的変数

  5. 5

    Constメンバー関数

  6. 6

    C ++:constメンバー関数から非constポインターパラメーターを受け取る外部関数にポインター値のメンバー変数を渡すことができるのはなぜですか?

  7. 7

    ヘッダーのプライベート静的constメンバー変数とcppのconst変数

  8. 8

    constメンバー関数からクラスメンバーへのポインタを返す

  9. 9

    この関数とメンバー関数のconst-correctness

  10. 10

    テンプレートコンテナのconst関数のメンバー変数を変更するコンパイラエラー

  11. 11

    テンプレートでのメンバー関数ポインターの変換

  12. 12

    constメンバー関数から非constメンバー関数ポインターを呼び出す

  13. 13

    インスタンスメンバーのプロパティへのメンバー関数の割り当て

  14. 14

    テンプレートとメンバー関数へのポインター

  15. 15

    constメンバー変数を介したインライン関数へのアクセス

  16. 16

    メンバーへのポインターが参照する関数タイプ

  17. 17

    非テンプレートメンバー関数ポインターへのテンプレートメンバー関数ポインター

  18. 18

    メンバー関数エラーへのポインター

  19. 19

    関数ポインターメンバー変数

  20. 20

    インターフェースの属性/メンバー変数?

  21. 21

    メンバー関数ポインターからのQMetaMethod

  22. 22

    C ++メンバー関数ポインターの定義

  23. 23

    メンバー関数へのポインター

  24. 24

    関数メンバーへのポインター

  25. 25

    メンバー関数構文へのポインター

  26. 26

    メンバー関数へのポインター

  27. 27

    派生クラスのメンバー関数ポインター

  28. 28

    メンバー関数へのポインター-構文

  29. 29

    配列のインデックスとなるメンバー関数間でconst変数を渡す

ホットタグ

アーカイブ