6
template<typename T>
void print_size(const T& x)
{
    std::cout << sizeof(x) << '\n';
}

int main()
{
    print_size("If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.");
    // prints 115
}

これは、最近の g++ コンパイラで 115 を出力します。どうやら、T(ポインタではなく)配列であると推定されます。その動作は標準で保証されていますか? auto次のコードはポインターのサイズを出力し、テンプレートの引数推定とまったく同じように動作すると思ったので、少し驚きましたか?

int main()
{
    auto x = "If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.";
    print_size(x);
    // prints 4
}
4

1 に答える 1

8

autoテンプレート実引数推定のように正確に1動作します。そっくりT

これを比較してください:

template<typename T>
void print_size(T x)
{
    std::cout << sizeof(x) << '\n';
}

int main()
{
    print_size("If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.");
    // prints 4
    auto x = "If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.";
    print_size(x);
    // prints 4
}

これとともに:

template<typename T>
void print_size(const T& x)
{
    std::cout << sizeof(x) << '\n';
}

int main()
{
    print_size("If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.");
    // prints 115
    const auto& x = "If you timidly approach C++ as just a better C or as an object-oriented language, you are going to miss the point.";
    print_size(x);
    // prints 115
}

1完全ではありませんが、これはまれなケースではありません。

于 2012-11-09T13:24:31.493 に答える