Подтвердить что ты не робот

Инициализаторы в классе, использующие = для шаблонов классов

Извиняюсь, но я не понимаю, почему следующее не будет работать (gcc 4.8.1):

#include <string>

using namespace std;

template <typename T> struct A{
    //A(): s("why") { } //fine
    //string s{"what"}; //also fine
    //A() = default; //(same error as below)
    string s = "why?!"; //error: conversion from 'const char [6]' to non-scalar type 'std::string {aka std::basic_string<char>}' requested|
};

struct B{
    string s = "why?!"; //all good
};

int main(){
    A<int> a;
    B b;
}

По какой-то причине, введя шаблон, я не могу использовать = для инициализатора в классе строки s. Встроенные типы работают, и я действительно могу обойти его, используя фигурные скобки или явно интуитивно понятный в конструкторе по умолчанию. Почему возникает проблема с использованием =?

4b9b3361

Ответ 1

Я не вижу причин, по которым это не должно работать, и последние версии gcc и clang компилируют ваш код без проблем.

Это связано с следующей ошибкой gcc: Брейс-инициализация вектора с прямой инициализацией NSDMI не работает в шаблоне в который в инициализации класса работает для случая, отличного от шаблона, но не для случая шаблона:

#include <vector>

struct X {X(int) {}};

template <class zomg> 
class T {
  std::vector<int> x{0}; 
}; 

int main()
{
  T<int> t;
}

Этот отчет об ошибке: непустой бит-init-list нестатического элемента данных T [N] в шаблоне класса приводит к ошибке диагностики, если T является классом, немного ближе со следующим тестовым примером: сбой аналогичным образом:

struct A { };

template<class>
struct B {
  A a[1] = { A () };
};

int main () { B<void> b; }