Следующий пример, инициализирующий член std::array <char, N>
в конструкторе с использованием строкового литерала, не компилируется в GCC 4.8, а компилируется с использованием Clang 3.4.Инициализация std :: array <char,x> член в конструкторе с использованием строкового литерала. Ошибка GCC?
#include <iostream>
#include <array>
struct A {
std::array<char, 4> x;
A(std::array<char, 4> arr) : x(arr) {}
};
int main() {
// works with Clang 3.4, error in GCC 4.8.
// It should be the equivalent of "A a ({'b','u','g','\0'});"
A a ({"bug"});
for (std::size_t i = 0; i < a.x.size(); ++i)
std::cout << a.x[i] << '\n';
return 0;
}
При первом впечатлении это выглядит как ошибка GCC. Я чувствую, что он должен компилироваться, поскольку мы можем инициализировать std::array<char, N>
непосредственно строковым литералом. Например:
std::array<char, 4> test = {"bug"}; //works
Мне было бы интересно узнать, что говорит об этом Стандарт.
Скомпонован с clang 3.5 (ствол 200501) с помощью '-Wall -Wextra' и работает так, как ожидалось. [Сообщения об ошибках с gcc online] (http://ideone.com/A0Wza7). – Ali
FWIW, 'A a (std :: array {" bug "});' принимается GCC, поэтому «неизвестное преобразование для аргумента 1 из« <список с инициализатором, заключенным в скобки »> в 'std :: array «Мне очень странно выглядит. –
hvd
Я не понимаю, почему {{"bug"}} работает, вы запрашиваете 4-мерный массив символов, а не для строки (это другой зверь). Возможно, clang является умным и фиксирует код пользователя. –