To me a pair
is just special case of a tuple
, but following surprises me:
pair p1(1, 2); // ok
tuple
In addition to Praetorian's correct answer (which I've upvoted), I wanted to add a little more information...
Post-C++14, the standard has been changed to allow:
tuple<int, int> t2={1, 2};
to compile and have the expected semantics. The proposal that does this is N4387. This will also allow constructs such as:
tuple<int, int>
foo()
{
return {1, 2};
}
It only allows it if all T
in the tuple
are implicitly contructible from all arguments.
As a non-conforming extension, libc++ already implements this behavior.
The tuple constructor you're trying to call is explicit
, so copy-list-initialization will fail. The corresponding pair constructor is not explicit
.
Change your code to
tuple<int, int> t2{1, 2};
and it'll compile.