2

std :: vectorを参照によって関数に渡そうとしてきましたが、デフォルト値は空のstd::vectorです。私の関数の宣言は次のようになります。

void function( std::vector<double>& vec=std::vector<double>(0));

私の関数の定義は次のとおりです。

void function( std::vector<double>& vec)
{
...
}

しかし、私のC ++コンパイラ(gcc 4.6)は、ここで次のようなエラーをスローしています。

エラー:タイプ'std :: vector&'のパラメータのデフォルト引数のタイプは'std :: vector'</ p>

このバージョンのコードは、MicrosoftVS2010コンパイラで正常にコンパイルされるのを見てきました。そして、これがgccとvs2010の間で異なるc++標準解釈の問題であるかどうか疑問に思っています。

4

4 に答える 4

9

できません。一時的なものをref-to-non-にバインドすることはできないconstため、これを行うことしかできません。

void function(const std::vector<double>& vec = std::vector<double>());

あなたの場合、関数のオーバーロードをお勧めします。

void function(std::vector<double>& vec)
{
    // ...
}

void function()
{
    std::vector<double> v;
    function(v);
}

余分な関数呼び出しが気に入らない場合は、運が悪いです。:)

C ++ 11の右辺値の参照にアクセスできる場合、ここで役立つかどうかはわかりません。

このバージョンのコードは、MicrosoftVS2010コンパイラで正常にコンパイルされるのを見てきました。そして、これがgccとvs2010の間で異なるc++標準解釈の問題であるかどうか疑問に思っています。

MSVSには、一時的なものをrefs-to-non-にバインドできる傾向がありますconst。これは、非標準の動作です。GCCは正しいです。

于 2012-11-06T10:20:53.370 に答える
1

次のことができます。

namespace{
    auto empty_vec = std::vector<double>();
}

void function(std::vector<double>& vec=empty_vec);

その後、関数のシグネチャを変更する必要はありません。empty_vecただし、代わりに変数を定義する必要があります。名前のない名前空間に入れて、この翻訳ユニットの外部から見えないようにしました。ただし、欠点は(LightnessRacesinOrbitが以下に示すように)、この変換ユニット内での値をempty_vec変更できることです。これにより、関数が破損する可能性があります。

于 2012-11-06T10:32:57.933 に答える
0

一時オブジェクトをnonconst左辺値参照として渡すことはできません!const修飾子を追加するか、デフォルトの引数を削除します。

于 2012-11-06T10:21:43.460 に答える
-1

次のメソッドは、デフォルト値が何であるかを明確にします-そしてそれは他のデフォルトの振る舞いに置き換えることができます。

static std::vector<double> emptyVectorProvider()
{
    return (std::vector<double>());
}

void function (std::vector<double>&& = emptyVectorProvider ());

void function2 (std::vector<double>&& def = emptyVectorProvider ())
{
    function(std::forward<std::vector<double> > (def));
}
于 2015-08-29T23:15:29.770 に答える