C++11 为什么这是最简单的C++;0x代码无效?

C++11 为什么这是最简单的C++;0x代码无效?,c++11,ref,C++11,Ref,我刚才遇到了一个奇怪的问题 源代码简单明了,如下所示: #include <vector> #include <iostream> #include <functional> using namespace std; using namespace std::tr1; template<class T_> void show_size(T_ coll) { cout << coll.size(); } int mai

我刚才遇到了一个奇怪的问题

源代码简单明了,如下所示:

#include <vector>
#include <iostream>
#include <functional>

using namespace std;
using namespace std::tr1;

template<class T_>
void show_size(T_ coll)
{   
    cout << coll.size();
}

int main()
{
    vector<int> coll;
    coll.push_back(1);

    show_size(ref(coll));

    return 0;
}
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::tr1;
模板
无效显示大小(T\uColl)
{   

cout不可能,这就是引用包装的全部要点,因为它不会从引用中衰减,除非使用
.get()


编辑:不要将boosts引用包装器与标准包装器混淆,boosts实际上有隐式转换(但目标功能有点不同)

不可能,这就是引用包装器的全部要点,因为它不会从引用中衰减,除非使用
.get()


编辑:不要将boosts引用包装器与标准包装器混为一谈,boostone实际上有隐式转换(但目标功能有点不同)“模板函数SkyOsig不知道也不应该知道Ty是否是RealthyType包装器。如果我使用CUTH@ XMLMX,你有一个模板,它需要值,但是你试图强迫它引用。这不是一个好的设计。@ LeTexMeYBE: C++标准20.84.3(N3126)清楚地定义了操作符T&())。因此,隐式转换符合C++的预标准。@ LeTeMeBebe:我的设计目标是:默认情况是通过值;但是,如果调用方认为它的参数太大,不能通过值,他可以显式使用REF来传递引用。这也是STL的设计规则之一。@ XMLMX UH。STL使用常数引用。y值仅对POD类型有意义,任何较大的值通常都应作为常量引用传递。好的,隐式转换的说法是正确的,但在这种情况下不会起作用。如果将
reference\u wrapper
传递为
int&
@Let\u Me\u be,则会起作用:模板函数show\u size不应该知道W类型Type是否是RealthyTyWrasePr.It如果使用CUTH@ XMLLMX,您有一个模板,它需要值,但是您试图强制它引用它。这不是一个好的设计。@ LeTexMeYBE: C++标准20.84.3(N3126)清楚地定义了操作符T&()。因此,隐式转换符合C++的预标准。@ LeTeMeBebe:我的设计目标是:默认情况是通过值;但是,如果调用方认为它的参数太大,不能通过值,他可以显式使用REF来传递引用。这也是STL的设计规则之一。@ XMLMX UH。STL使用常数引用。y值仅对POD类型有意义,任何较大的值通常都应作为常量引用传递。好的,隐式转换的观点是正确的,但在这种情况下不会起作用。如果将
reference\u wrapper
作为
int&
传递,则会起作用。这与隐式转换的问题几乎相同成员访问时不会发生这种情况。我的建议是使用与另一个线程相同的免费
get
函数:
get(coll).size();
@UncleBens:非常感谢您的帮助。我只是想知道为什么ref()的行为如此违反直觉。如果我的模板函数必须显式使用get(),那么函数就不那么通用了。对我来说,这是代码中的一种“坏味道”。这种语言根本不允许使用点运算符进行隐式转换。可能有代码味道,但也可能是因为你一直在按值传递东西,然后期望参数是引用。这不是“最简单的”C++0x code…这与问题几乎相同。同样,隐式转换不会发生在成员访问上。我的建议是使用与另一个线程相同的免费
get
函数:
get(coll).size();
@UncleBens:非常感谢您的帮助。我只是想知道为什么ref()的行为是如此违反直觉。如果我的模板函数必须显式使用get(),那么该函数就不那么通用了。对我来说,这是一种“异味”在代码中,该语言不允许使用点运算符进行隐式转换。可能有代码气味,但也可能是因为您一直在按值传递内容,然后期望参数是引用。这不是“最简单”的C++0x代码。。。