1

const int特殊化による次のエラー:

#include <iostream>
using std::cout;
using std::endl;

template <typename T> void g(T val)
{
    cout << "unknown" << endl;
}

template <> void g(int && val)
{
    cout << "int &&" << endl;
}

template <> void g(const int && val)
{
    cout << "const int &&" << endl;
}

template <> void g(int & val)
{
    cout << "int &" << endl;
}

template <> void g(const int & val)
{
    cout << "const int &" << endl;
}

template <> void g(int val)
{
    cout << "int" << endl;
}

template <> void g(const int val)  //redefinition here
{
    cout << "const int" << endl;
}

int main() {}

error: redefinition of 'g'
template <> void g(const int val)
                 ^

なぜ と はT&T&&区別されconst T&ますconst T&&が、 は と区別されTませんconst Tか?

4

2 に答える 2

6

関数パラメーターの最上位の定数性は、関数の実装の詳細であるためです。たとえば、次は有効です。

// Prototype
void foo(int c);

// Implementation
void foo(int const c) { ... }

引数は値で渡されるため、関数が自身のプライベート コピーを変更するかどうかは、呼び出し側にはあまり関係ありません。したがって、最上位の const-ness は関数シグネチャの一部ではありません。

これはトップレベルの const-ness にのみ適用されることに注意してください! intとは、と とint const同様に、関数プロトタイプでは等価です。しかし、そうではありません。int *int * constint *int const *

于 2012-10-31T16:07:25.860 に答える
0

引数を使用する場合、考慮すべき点がいくつかあります。A: 引数を参照渡ししないことは、独自の新しい変数を作成することであり、B: 参照渡しは、引数と同じ変数を別の名前で使用することです。

これは次の理由で重要です。

void doStuff (const int x)
{
    //x is its own constant variable
}

一方

void doStuff (const int& x)
{
    //because x is the same variable that was used when calling this function
    //x can be modified outside of this function, but not inside the function
    //due to the const modifier
}

2 番目の関数の const 修飾子を使用すると、次のようなことができます。

int main ()
{
    const int x = 10;
    doStuff(x)
}

参照は、別の関数で変数を変更し、スタックにメモリを節約するために使用されます。これは、新しく作成された変数ではなくポインターを使用するため、メモリを節約します。関数でそれを変更していない

これがブール演算子であり、引数の型を変更しないため、 && 演算子を引数で使用しないでください。条件でのみ使用する必要がありますが、コンパイル時に構文エラーを作成することはありません (コンパイラーはそれを型 [type] & の参照と見なします)。ただし、変数の使用方法には何も影響しませんが、コンピューターの処理に少し時間がかかります。

于 2012-10-31T20:01:38.817 に答える