C++ C++;有一个自由函数'size(object)`?

C++ C++;有一个自由函数'size(object)`?,c++,visual-studio-2015,c++17,non-member-functions,C++,Visual Studio 2015,C++17,Non Member Functions,似乎大多数人找到字符串大小的方法是他们只使用my_string.size(),效果很好。嗯,我最近在课堂上做了一个作业,我做了 if (size(my_string) < 5) store[counter].setWeight(stoi(my_string)); if(大小(我的字符串)返回0; >代码>主< /代码>是隐式的。因此我没有添加它。是的,但是有没有理由将代码限制到编译器中?其他标准库很快就添加了更多的C++ 1Z特性。@ DEXPRECTOR WHA?返回0 < /

似乎大多数人找到
字符串大小的方法是他们只使用
my_string.size()
,效果很好。嗯,我最近在课堂上做了一个作业,我做了

if (size(my_string) < 5)
    store[counter].setWeight(stoi(my_string));
if(大小(我的字符串)<5)
存储[计数器]。设定重量(stoi(我的字符串));
而不是

if (my_string.size() < 5)
    store[counter].setWeight(stoi(my_string));
if(my_string.size()<5)
存储[计数器]。设定重量(stoi(我的字符串));
但令我惊讶的是,我的指导老师,我相信他正在运行一个旧的编译器,却不能运行那行代码。在我的编译器上,它是双向工作的,我不太清楚为什么

一个完整的程序(两个都输出4个):

#包括
#包括
使用名称空间std;
int main()
{
字符串myvar=“1000”;

coutMSVS 2015具有xutility中定义的
size
功能

template<class _Container>
auto inline size(const _Container& _Cont)
    -> decltype(_Cont.size())
{   // get size() for container
return (_Cont.size());
}
模板
自动内联大小(常量容器和常量)
->decltype(_Cont.size())
{//获取容器的大小()
返回(_Cont.size());
}
这是调用时正在使用的函数

cout << "Using size(myvar) = " << size(myvar) << endl;
cout根据VS2015开始支持非会员
size
提案

这有点奇怪,他们在没有任何定义或编译器标志的情况下启用了它。但似乎是这样。目前它可能被认为是非标准的,尽管它已经投票支持c++17。

实际上是c++17的功能。它的真正好处类似于c++11的好处

请注意,
size
的第一个定义仅返回容器的size方法

因此,如果我有一个模板函数,如下所示:

template <typename T>
auto foo(const T& bar) { return bar.size(); }
模板
auto foo(const T&bar){return bar.size();}
这只能用于容器,但如果我将其更改为:

template <typename T>
auto foo(const T& bar) { return size(bar); }
模板
自动foo(const T&bar){返回大小(bar);}
它也可以用于C样式的数组。我在这里添加了一个实例:


总之,由于通用性和容器无关性代码的改进,您应该始终使用
size
和其他基于范围的函数(更多信息请参见)。

什么是
temp
?函数
sizeof
do是什么?可互换的大小(x)和x.size()是为c++17设计的。向我们展示完整的程序。您展示的代码不完整,无法编译。@Feek:有可能,我可以告诉您这么多。这完全证明了他们已经实现了@Richard Hodges所述的功能。同意。由于MSVS 2013中没有该功能,因此这很可能是c++17功能的早期实现。(我希望他们停止这样做-。-)[编辑:由发行说明确认-值得添加到答案中?]@LightnessRacesinOrbit同意。他们应该将其作为一种选择,甚至放弃使用命名空间std;
()因为
std::string
也在
std
@Deduplicator中,所以不会更改任何内容,我知道
void main()
仅限Microsoft。由于Microsoft目前是唯一支持此功能的编译器,我想为什么不可以。如果它让您非常恼火,您必须编辑答案,请添加一个
返回0;
。我现在要回滚。如果您觉得有足够的理由再试一次,并添加
返回值,我不会回滚。@JonAthMeMe:在C++中,在C99 +代码>返回0; >代码>主< /代码>是隐式的。因此我没有添加它。是的,但是有没有理由将代码限制到编译器中?其他标准库很快就添加了更多的C++ 1Z特性。@ DEXPRECTOR WHA?<代码>返回0 < /COD>在代码<主< <代码>是隐式的?给我一个引用?在C++中看到[Basic,St.main ](main)返回语句有离开main函数的作用(破坏任何具有自动存储持续时间的对象)并以返回值作为参数调用std::exit。如果控件到达main结尾时未遇到return语句,则效果是执行return 0;“”。在C99+中,它是5.1.2.2.3程序终止(如果主函数的返回类型是与int兼容的类型,则从初始调用主函数返回的值相当于调用退出函数,并将主函数返回的值作为其参数;11)到达}终止主函数的返回值为0。如果返回类型与int不兼容,则返回到主机环境的终止状态为未指定。“)。就像
begin
end
,这很容易实现!
template <typename T>
auto foo(const T& bar) { return size(bar); }