相关疑难解决方法(0)

c ++ 11函数调用中的单元素向量初始化

请考虑以下示例代码:

例:

void print(int n) {
    cout << "element print\n";
}

void print(vector<int> vec) {
    cout << "vector print\n";
}

int main() {
   /* call 1 */ print(2);
   /* call 2 */ print({2});
   std::vector<int> v = {2};
   /* call 3 */ print(v);
   /* call 4 */ print( std::vector<int>{2} );
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

它生成以下输出:

element print
element print
vector print
vector print
Run Code Online (Sandbox Code Playgroud)

为什么print函数调用(上例中的调用2)与接受单个值的函数匹配?我在这个调用中创建了一个向量(包含单个元素),所以它与print使用向量作为输入的调用不匹配吗?

在另一个问题中进行了部分讨论,其中所提供的解决方案适用于具有多于1个元素的向量.

c++ stl vector overload-resolution c++11

6
推荐指数
2
解决办法
2270
查看次数

从括号内的initializer_list构造时调用错误的重载

我一直以为当我使用初始化列表C++语法时:

something({ ... });
Run Code Online (Sandbox Code Playgroud)

编译器总是清楚我想要调用过载std::initializer_list,但对于MSVC 2015来说似乎并不那么清楚.

我测试了这个简单的代码:

#include <cstdio>
#include <initializer_list>

namespace testing {
  template<typename T>
  struct Test {
    Test() {
      printf("Test::Test()\n");
    }

    explicit Test(size_t count) {
      printf("Test::Test(int)\n");
    }

    Test(std::initializer_list<T> init) {
      printf("Test::Test(std::initializer_list)\n");
    }

    T* member;
  };

  struct IntSimilar {
    int val;

    IntSimilar() : val(0) {}
    IntSimilar(int v) : val(v) {}

    operator int() {
      return val;
    }
  };
}

int main() {
    testing::Test<testing::IntSimilar> obj({ 10 });
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

并且在GCC 6.3中它按预期工作,呼叫 Test::Test(std::initializer_list)

但在MSVC 2015中,此代码调用Test::Test(int).

似乎MSVC可以以某种方式忽略 …

c++ visual-c++ language-lawyer c++11 clang++

6
推荐指数
2
解决办法
308
查看次数