相关疑难解决方法(0)

从括号内的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
查看次数

标签 统计

c++ ×1

c++11 ×1

clang++ ×1

language-lawyer ×1

visual-c++ ×1