9

なぜ参照ではないのかを理解しようとしてnot_a_refいます。で参考にできると思いますauto &。私はしばらくの間標準を掘り下げましたが、迷子になり、この動作がどこで定義されているのか理解できませんでした。

例:

#include <vector>
#include <iostream>
#include <type_traits>

std::vector<int> stuff;

std::vector<int>& get_stuff()
{
    return stuff;
}

int main()
{
    auto not_a_ref = get_stuff();

    if( std::is_reference<decltype(not_a_ref)>::value )
        std::cout << "is_reference true" << std::endl;
    else
        std::cout << "is_reference false" << std::endl;

    if( &not_a_ref != &stuff )
        std::cout << "definately not a reference" << std::endl;

    return 0;
}
4

3 に答える 3

5

C ++ 11ドラフト、7.1.6.4(auto指定者)パラグラフ6から:

変数dに対して推定される型は、関数呼び出し(14.8.2.1)からのテンプレート引数推定のルールを使用して決定された推定Aです。

そして14.8.2.1から(関数呼び出しからテンプレート引数を推測する)段落3:

Pが参照型の場合、Pによって参照される型が型推定に使用されます。

したがって、の型控除では参照は無視されautoます。

このルールがのルールとどのように異なるかに注意してくださいdecltype

更新:14.8.2.1段落3は適用されないと思うので、以下の私のコメントを参照してください。

于 2012-07-01T09:55:17.863 に答える
3

テンプレート引数の推論を見てください。のタイプに関しては、これauto x = stuff;とまったく同じです。template<typename T> void f(T x) {} f(stuff);x

于 2012-07-01T04:47:25.103 に答える
-1

C ++ 11標準によれば、autoはsimple-type-specifier [7.1.6.2]としてカウントされるため、他のsimple-type-specifierと同じルールが適用されます。これは、autoを使用して参照を宣言することは他のものと何ら変わりがないことを意味します。

これは次の行を意味します:

auto not_a_ref = get_stuff();

と同じになります:

std::vector<int> not_a_ref = get_stuff();
于 2012-07-01T08:11:49.057 に答える