基本上这是一个关于语义的问题。我正在使用Cereal库进行C ++中的(反)序列化,并发现其编码风格很有趣:
cereal::PortableBinaryInputArchive ar(instream);
int out;
ar(out);
// int is successfully deserialized from input stream here.
棘手的部分是我没有通过引用传递“out”,而ar()仍然可以修改它的值。实际上,作者只是覆盖了运算符“()”。我在源文件中找到了相应的行。
OutputArchive & operator=( OutputArchive const & ) = delete;
//! Serializes all passed in data
/*! This is the primary interface for serializing data with an archive */
template <class ... Types> inline
ArchiveType & operator()( Types && ... args )
{
self->process( std::forward<Types>( args )... );
return *self;
}
我很茫然,特别是第一行(“=删除”)和关于“std :: forward(args)......”的事情。我只看到了一些使用像va_arg这样的宏的情况,这是我第一次遇到这样的事情。此外,“&amp;&amp;”是什么代表?任何人都可以对它有所了解吗?
答案 0 :(得分:4)
我很茫然,尤其是第一行(&#34; =删除&#34;)
&#34; =删除&#34;有效地确保不能调用operator =(赋值运算符...),并且不应生成默认(赋值运算符)。它是相同的使operator = private,并没有提供定义。此运算符也可用于正常功能,在这种情况下,它的使用类似(参见c ++ 11标准,第8.4.3节):
class MyPair<T> {
private final int hashCode;
private final T value;
}
Observable.just("Moscou").map(city -> new MyPair<String>(city, city.hashCode()).subscribe(pair -> /** **/);
请注意,调用foo的类型很重要。它仍然可以在基类型上调用,就像人们仍然可以切片一样,即使禁止派生赋值(参见下面的示例):
struct B
{
void foo(){}
};
struct D : B
{
void foo() = delete;
};
int main() {
D().foo(); //Fails to compile here - deliberate!!!
return 0;
}
以及关于&#34; std :: forward(args)...&#34;的事情。
std :: forward允许完美转发参数(即参数的类型与r / l值和修饰符不会改变(Refer)。
我只看到了一些案例 像va_arg这样的宏被使用了,这是我第一次使用它 遇到过这样的事情。
struct B{};
struct D : B
{
D& operator=(const D&) = delete;
};
int main() {
B b;
D d1, d2;
b = d1; //Compiles fine - slices
d1 = d2; //Fails to compile...
return 0;
}
在这种情况下......被称为可变参数模板(谷歌)。
此外,&#34;&amp;&amp;&#34;代表? 任何人都可以对它有所了解吗?
&安培;&安培;代表rvalue引用或通用引用,具体取决于上下文。在这种情况下,它是一个通用参考(Scott Meyers有一篇关于通用引用的好文章here)。
编辑: 通用引用现在正确地称为转发引用(n4164)。