C++ std::成员指针行为的元组

C++ std::成员指针行为的元组,c++,templates,c++11,C++,Templates,C++11,我想了解这种行为的原因: 此代码非常有效: #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);

我想了解这种行为的原因:

此代码非常有效:

#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;
}
#包括
#包括
结构类{
int v1;
int v2;
int v3;
};
自动pv1=&SomeClass::v1;
自动pv2=&SomeClass::v2;
自动pv3=&SomeClass::v3;
自动t=std::tie(pv1、pv2、pv3);
int main(){
c类;
c、 v1=111;
c、 v2=222;
c、 v3=333;

std::cout如果我们查看CPP的参考文档,它说(我的重点):

我们可以看到,将右值引用传递给
make\u tuple
确实有效:

模板
元组生成(类型和参数);
^^
#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;
}
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
     ^
template< class... Types >
tuple<Types&...> tie( Types&... args );
auto t = std::make_tuple(&SomeClass::v1, &SomeClass::v2, &SomeClass::v3);
template< class... Types >
tuple<VTypes...> make_tuple( Types&&... args );
                                  ^^