Я отследил неясную ошибку ведения журнала, связанную с тем, что списки инициализаторов длины 2 представляют собой особый случай! Как это возможно?
Код был скомпилирован с помощью Apple LLVM версии 5.1 (clang-503.0.40) с использованием CXXFLAGS=-std=c++11 -stdlib=libc++
.
#include <stdio.h>
#include <string>
#include <vector>
using namespace std;
typedef vector<string> Strings;
void print(string const& s) {
printf(s.c_str());
printf("\n");
}
void print(Strings const& ss, string const& name) {
print("Test " + name);
print("Number of strings: " + to_string(ss.size()));
for (auto& s: ss) {
auto t = "length = " + to_string(s.size()) + ": " + s;
print(t);
}
print("\n");
}
void test() {
Strings a{{"hello"}}; print(a, "a");
Strings b{{"hello", "there"}}; print(b, "b");
Strings c{{"hello", "there", "kids"}}; print(c, "c");
Strings A{"hello"}; print(A, "A");
Strings B{"hello", "there"}; print(B, "B");
Strings C{"hello", "there", "kids"}; print(C, "C");
}
int main() {
test();
}
Выход:
Test a
Number of strings: 1
length = 5: hello
Test b
Number of strings: 1
length = 8: hello
Test c
Number of strings: 3
length = 5: hello
length = 5: there
length = 4: kids
Test A
Number of strings: 1
length = 5: hello
Test B
Number of strings: 2
length = 5: hello
length = 5: there
Test C
Number of strings: 3
length = 5: hello
length = 5: there
length = 4: kids
Я также должен добавить, что длина поддельной строки в тесте b кажется неопределенной - она всегда больше, чем первая строка инициализатора, но варьируется от длины первой строки на единицу до суммы длин двух строк. в инициализаторе.
std::initializer_list
. Но это определенно странно. - person Potatoswatter   schedule 09.06.2014b
6 или 8? Ревизия изменила его. - person Potatoswatter   schedule 09.06.2014g++ (GCC) 4.9.0
. - person Rubens   schedule 09.06.2014Strings
в main, но оно исчезает, когда вы закомментируете вызовыprint()
вtest()
. Я думаю, что происходит какой-то UB. -- coliru.stacked-crooked.com/a/bf9b59160c6f46b0 - person 0x499602D2   schedule 09.06.2014