所以我把这个程序交给了 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;
}
叮当输出s = aaaaaaaaaaaaaaaa
(如预期)。
g++(版本 5 到 8)输出s = s = aaaaaaaa
(相当出乎意料)。
如果您不使用可变参数模板(如果删除所有 代码并内联字符列表来初始化,则不会发生这种情况A::s
.
如果您更换也不会发生这种情况std::string
通过字符数组(并使用A<Cs...>::s = {Cs...}
反而)。
这段代码是不是本意如此,还是编译器错误?