C++ 有自由函数 size(object) 吗?

Does C++ have a free function `size(object)`?

似乎大多数人找到 string 大小的方法是他们只是使用 my_string.size() 并且它工作正常。好吧,我最近为 class 做了一个作业,我在那里...

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。

MSVS 2015 在 xutility

中定义了一个 size 函数
template<class _Container>
auto inline size(const _Container& _Cont)
    -> decltype(_Cont.size())
{   // get size() for container
return (_Cont.size());
}

这是您调用

时正在使用的函数
cout << "Using size(myvar) = " << size(myvar) << endl;

这不是标准的 C++11/14 函数,不会 运行 gcc or clang

这在博客中有详细说明 post C++11/14/17 Features In VS 2015 RTM

根据http://blogs.msdn.com/b/vcblog/archive/2015/06/19/c-11-14-17-features-in-vs-2015-rtm.aspx VS2015 started to support non-member size n4280提议。

他们在没有任何定义或编译器标志的情况下开箱即用,这有点奇怪。不过好像是。目前它可能被认为是非标准的,尽管它已经被投票支持 c++17。

size is actually C++17 functionality. The real benefit to is akin to the benefit of begin and end 来自 C++11。

请注意 size 的第一个定义只是 returns 容器的大小方法。

所以如果我有这样的模板化函数:

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 和其他基于范围的函数,因为通用性和容器不可知代码得到了改进(有关更多信息,请参见 here)。