c++11 - foo({1,2}) 如何为 "void foo(pair<int,int>)"工作

标签 c++11

std::pair 没有以初始化列表为参数的构造函数,但下面的代码如何编译?

void foo(std::pair<int,int> pr)
{
}

void foo2(std::tuple<int,int,int> t)
{
}

void bar()
{
    foo({1,2});                               // compile OK
    foo(std::pair<int,int>{1,2});             // compile OK
    foo2(std::tuple<int,int,int>{1,2,3});     // compile OK
    foo2({1,2,3});     // compile error
}

我用的是clang3.7.0

最佳答案

统一初始化与初始化列表无关。大括号初始化列表(用于初始化对象时 {} 的技术术语)可以调用任何构造函数(尽管它可以仅限于非显式构造函数,取决于您如何使用它)。它更喜欢 initializer_list 构造函数,但它会调用与其参数列表匹配的任何构造函数。

因此它调用带有两个适当类型参数的pair 构造函数。

foo2 是一个编译错误,原因我在上面提到过。 pair 的采用两个值的构造函数不是显式的,但 tuple 的等效构造函数是显式的。因此,您需要显式使用类型名称来调用构造函数:

foo2(std::tuple<int, int, int>{1,2,3});

请注意,在 C++17 中,如果类型列表中的类型可以从给定类型非显式转换,则此 tuple 构造函数将变为非显式。所以您的原始语句应该在 C++17 实现下工作。

关于c++11 - foo({1,2}) 如何为 "void foo(pair<int,int>)"工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34209779/

相关文章:

c++ - enable_if 函数在不应该定义的时候定义

c++11 - std::chrono::system_clock::time_point 的值可以根据时区更改吗?

C++ 正则表达式行为

c++ - 两阶段查找运算符 << 问题?

macos - C++、OS X 的 clang 与 GCC 中的 Lambda 表达式

c++ - 当键可能不存在时,如何返回对对象的引用(来自 unordered_map)?

c++ - 在变量或字段 'printVector' 声明为 void 之前缺少模板参数

c++ - 模板参数 - 带有可变参数的函数指针

c++ - QByteArray 的标准替代品

c++ - 如何从就地临时变量初始化非静态私有(private)模板成员变量,即不进行复制或移动?