簡體   English   中英

std ::成員指針行為的元組

[英]std::tuple of member pointer behavior

我想了解這種行為的原因:

該代碼可以完美地工作:

#include <iostream>
#include <tuple>

struct SomeClass {
 int v1;
 int v2;
 int v3;
};


auto pv1 = &SomeClass::v1;
auto pv2 = &SomeClass::v2;
auto pv3 = &SomeClass::v3;

auto t = std::tie(pv1, pv2, pv3);

int main() {

  SomeClass c;
  c.v1 = 111;
  c.v2 = 222;
  c.v3 = 333;

  std::cout << c.*std::get<0>(t) << std::endl << c.*std::get<1>(t) << std::endl << c.*std::get<2>(t) << std::endl;
}

但這不能編譯

#include <iostream>
#include <tuple>

struct SomeClass {
 int v1;
 int v2;
 int v3;
};

auto t = std::tie(&SomeClass::v1, &SomeClass::v2, &SomeClass::v3);

int main() {

  SomeClass c;
  c.v1 = 111;
  c.v2 = 222;
  c.v3 = 333;

  std::cout << c.*std::get<0>(t) << std::endl << c.*std::get<1>(t) << std::endl << c.*std::get<2>(t) << std::endl;
}

在gcc中出現以下錯誤

test.cpp:17:65: error: invalid initialization of non-const reference of type ‘int SomeClass::*&’ from an rvalue of type ‘int SomeClass::*’
 auto t = std::tie(&SomeClass::v1, &SomeClass::v2, &SomeClass::v3);
                                                                 ^
In file included from test.cpp:2:0:
/usr/include/c++/4.8/tuple:1044:5: error: in passing argument 1 of ‘std::tuple<_Elements& ...> std::tie(_Elements& ...) [with _Elements = {int SomeClass::*, int SomeClass::*, int SomeClass::*}]’
     tie(_Elements&... __args) noexcept
     ^

背景問題:您可能會懷疑,我想將一些Class的某些成員組合到元組中,以執行一些模板魔術。

如果我們看一下std :: tie的cppreference文檔,它會說( 強調我的 ):

 template< class... Types > tuple<Types&...> tie( Types&... args ); 

創建一個左值引用元組,以引用其參數或std :: ignore實例。

在第一種情況下, pv1pv2pv3都是左值,因此將非常量左值引用綁定到它們是有效的。

在第二種情況下,您正在傳遞右值,因此無法將非常量左值引用綁定到它們。 您可以使用std :: make_tuple來完成這項工作:

auto t = std::make_tuple(&SomeClass::v1, &SomeClass::v2, &SomeClass::v3);

我們可以看到將右值引用傳遞給make_tuple確實是有效的:

 template< class... Types > tuple<VTypes...> make_tuple( Types&&... args ); ^^ 

暫無
暫無

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

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