std::pair<int, int>
은 here의 네 번째 정의를 사용하여 const std::pair<int, float>&
에서 내재적으로 생성 가능합니다.왜 std :: pair <int, int> const std :: pair로부터 생성 가능한가? <int, float> &?
#include <iostream>
#include <vector>
#include <utility>
int main() {
std::vector<std::pair<int, float>> v = { {1, 1.5f} };
// The interesting line:
const std::pair<int, int>& x = v[0];
const auto& y = v[0];
std::cout << "before:\n";
std::cout << "\tv[0]: " << std::get<1>(v[0]) << "\n";
std::cout << "\tx: " << std::get<1>(x) << "\n";
std::cout << "\ty: " << std::get<1>(y) << "\n";
std::get<1>(v[0]) = 3.5f;
std::cout << "\nafter:\n";
std::cout << "\tv[0]: " << std::get<1>(v[0]) << "\n";
std::cout << "\tx: " << std::get<1>(x) << "\n";
std::cout << "\ty: " << std::get<1>(y) << "\n";
}
출력은
이 (x
덜 y
보다 참조 같은 "느낌"고 어색한 것 같다
before:
v[0]: 1.5
x: 1
y: 1.5
after:
v[0]: 3.5
x: 1
y: 3.5
(ideone link) 점에서 그것은을 (합법적으로) 참조 무엇인지 아마도 사용자의 관점에서 볼 때 "잘못된"것입니다.)
마크가없는 해당 생성자의 이유는 무엇입니까? 에 explicit
? (I 중요한 유스 케이스가 있으리라 믿고있어.)
나는 미래를 주목할 것이다. std :: tuple은 비슷한 생성자를 가지고있다. –
@Dave : '명시 적으로'차이를 만들지 않는 이유는 무엇입니까? 그것은 나에게해야하고, const 참조에 바인딩하기 위해 일시적으로 변환하는 것은 암시 적 변환이라고 생각합니다. 예를 들어 http://ideone.com/k6qd6l –
SteveJessop의 의견에 비추어 볼 때 Dave의 답변에 동의하지 않았습니다. –