我希望在一些现有的c ++项目中使用一些c ++ 11特性,所以我开始在Clang中更改某些项目的编译标志,并且我一直遇到一个关于C ++ 11处理转换操作符(或者转换)的特定问题运算符)我没想到会看到并且不明白为什么现在这被认为是一个错误,因为它是有效的C ++代码而不是c ++ 11
我把它归结为这个简单的例子:
#include <iostream>
#include <vector>
class SerializableFormat
{
public:
size_t i;
};
class A
{
public:
size_t x, y;
A(size_t n) : x(n), y(1) { }
operator const SerializableFormat() const
{
SerializableFormat result;
result.i = x;
if (y)
{
result.i /= y;
}
return result;
}
};
int main(int argc, const char * argv[])
{
std::vector<SerializableFormat> v;
for(size_t i = 0; i < 20; i++)
{
v.push_back(A(i));
}
return 0;
}
- 如果Clang的编译标志设置为
-std=c++98
和libstdc++
,没有问题,这编译好。 - 如果Clang的编译标志设置为
-std=c++11
和libc++
,我收到错误No viable conversion from 'A' to 'value_type' (aka 'SerializableFormat')
只是为了清楚 - 如果你正在考虑为SerializableFormat提供一个仅用于类的构造函数 A
:
自从 SerializableFormat
class更适合转换到各种类,从而有意义 A
(以及其他希望可序列化的类)具有构造函数和转换运算符而不是期望 SerializableFormat
覆盖每个想要序列化的类,所以修改 SerializableFormat
拥有一个特殊的构造函数不是一个解决方案。
谁能看到我在这里做错了什么?