11

ほとんどの人が a のサイズを見つける方法stringは、 を使用するだけでmy_string.size()問題なく動作するようです。さて、私は最近、私が行ったクラスの課題を行いました...

if (size(my_string) < 5)
    store[counter].setWeight(stoi(my_string));

それ以外の....

if (my_string.size() < 5)
    store[counter].setWeight(stoi(my_string));

しかし驚いたことに、古いコンパイラを実行していると思われる私のインストラクターは、そのコード行を実行できませんでした。私のコンパイラでは両方の方法で機能しますが、その理由はよくわかりません。

完全なプログラム (両方に対して 4 を出力):

#include <string>
#include <iostream>
using namespace std;

int main()
{
    string myvar = "1000";
    cout << "Using size(myvar) = " << size(myvar) << endl;
    cout << "Using myvar.size() = " << myvar.size() << endl;
}

問題に対する私の解決策が私のマシンでは機能したが、私の教授では機能しなかった理由を誰かが明らかにすることができますか? また、現在VS2015を実行しています。

4

3 に答える 3

13

size実際には C++17 の機能です。の本当の利点はbeginendC++11 の利点と同様です。

の最初の定義はsize単にコンテナの size メソッドを返すことに注意してください。

したがって、次のようなテンプレート化された関数がある場合:

template <typename T>
auto foo(const T& bar) { return bar.size(); }

これはコンテナーでのみ使用できますが、それを次のように変更すると:

template <typename T>
auto foo(const T& bar) { return size(bar); }

C スタイルの配列でも使用できます。ここにライブの例を追加しました: http://melpon.org/wandbox/permlink/Rlpi5wueA14JOW2P

要約するsizeと、一般性とコンテナーに依存しないコードが改善されているため、他の範囲ベースの関数を常に使用する必要があります (詳細については、こちらを参照してください)。

于 2015-10-30T18:40:05.820 に答える
3

http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspxによると、VS2015は非メンバーのサポートを開始しましたsize n4280提案。

define フラグやコンパイラ フラグなしですぐに使用できるようになっているのはちょっと奇妙です。しかし、それはそのようです。現在は非標準と見なされている可能性がありますが、c++17 では既に投票されています。

于 2015-10-30T18:37:12.330 に答える