Итак, я передал эту программу g ++ и clang (оба в Linux, x86_64):
#include <iostream>
using namespace std;
template<char... Cs>
struct A {
static const string s;
static A a;
~A() {
cout << "s = " << s << "\n";
}
};
template<char... Cs>
const string A<Cs...>::s = {{Cs...}};
template<char... Cs>
A<Cs...> A<Cs...>::a;
int main(void)
{
(void)A<'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a', 'a'>::a;
return 0;
}
Clang выводит s = aaaaaaaaaaaaaaaa
(как и ожидалось).
g ++ (версии 5 до 8) выводит s = s = aaaaaaaa
(довольно неожиданно).
Этого не произойдет, если вы не используете шаблон переменной (если вы удалите весь код <> и встроите список символов для инициализации A::s
.
Этого также не произойдет, если вы замените std::string
на массив символов (и вместо этого будете использовать A<Cs...>::s = {Cs...}
).
Этот код не предназначен или это ошибка компилятора?