簡體   English   中英

函數如何修改C ++中按值傳遞的參數?

[英]How can a function modify a parameter passed in by value in C++?

基本上,這是一個關於語義的問題。 我正在使用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;
  }

我很茫然,尤其是第一行(“ = delete”)和有關“ std :: forward(args)...”的內容。 我只看到某些情況下使用了像va_arg這樣的宏,這是我第一次遇到這樣的情況。 此外,“ &&”代表什么? 誰能給它一些啟示?

我很茫然,尤其是第一行(“ = delete”)

“ =刪除”有效地確保不能調用operator =(賦值運算符...),並且不應生成默認值(賦值運算符)。 使運算符=私有是相同的,並且沒有提供定義。 此運算符也可以用於正常功能,在這種情況下,類似地禁止使用該運算符(請參閱c ++ 11標准的8.4.3節):

struct B
{
  void foo(){}
};

struct D : B
{
  void foo() = delete;
};

int main() {
    D().foo(); //Fails to compile here - deliberate!!!
    return 0;
}

注意,調用foo的類型很重要。 仍然可以在基本類型上調用它,就像即使禁止派生分配仍然可以切片一樣(請參見下面的示例):

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;
}

以及有關“ std :: forward(args)...”的內容。

std :: forward允許參數的完美轉發(即,具有r / l價值的參數類型和修飾符都不會更改(參考)

我只看到某些情況下使用了像va_arg這樣的宏,這是我第一次遇到這樣的情況。

template <class ... Types>
void foo( Types&& ...);

在此情況下,...被稱為可變參數模板(google)。

此外,“ &&”代表什么? 誰能給它一些啟示?

&&代表右值引用或通用引用,具體取決於上下文。 在這種情況下,它是通用參考(Scott Meyers在此處有一篇有關通用參考的好文章)。

編輯:通用引用現在正確稱為轉發引用(n4164)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM