这段代码:
#include <vector>
#include <string>
#include <iostream>
class MyClass
{
public:
MyClass(const std::vector<std::vector<std::string>> & v)
{
std::cout << "Vector of string vectors size: " << v.size() << "\n";
for (size_t i = 0; i < v.size(); i++)
std::cout << "Vector #" << i << " has size " << v[i].size() << "\n";
}
};
int main()
{
MyClass({ { "a" } }); // <--- ok
MyClass({ { "a", "b" } }); // <--- PROBLEM
MyClass({ { std::string("a"), "b" } }); // <--- ok
MyClass({ { "a", "b", "c" } }); // <--- ok
MyClass({ { "a" },{ "c" } }); // <--- ok
MyClass({ { "a", "b" },{ "c", "d" } }); // <--- ok
}
输出结果如下(Visual Studio 2017):
Vector of string vectors size: 1
Vector #0 has size 1
Vector of string vectors size: 4
Vector #0 has size 97
Vector #1 has size 0
Vector #2 has size 0
Vector #3 has size 0
Vector of string vectors size: 1
Vector #0 has size 2
Vector of string vectors size: 1
Vector #0 has size 3
Vector of string vectors size: 2
Vector #0 has size 1
Vector #1 has size 1
Vector of string vectors size: 2
Vector #0 has size 2
Vector #1 has size 2
所以,除了一个包含两个字符串的向量中只有一个向量的情况外,它在所有情况下都可以正常工作。如果我们从其中一个字符串字面值显式构造std :: string,则也适用于上述情况。如果两者都只是普通的字符串字面值,则编译器似乎会“混淆”,并构造一个包含97个字符串的4项向量。请注意,97是“a”的字符代码。
我猜我的问题是,编译器应该将这种有问题的构造解释为我期望的方式,还是初始化嵌套列表的这种代码是错误的?
void f(MyClass); f({{"a", "b"}});
不是二义性的,但会调用MyClass
的复制构造函数... - Holt