Я хочу использовать некоторые функции С++ 11 в некоторых существующих проектах на С++, поэтому я начал менять флаги компиляции в Clang для некоторых проектов, и я постоянно сталкиваюсь с конкретной проблемой, связанной с обработкой конверсий С++ 11 (или операторов трансляции), которые я не ожидал увидеть, и не понимаю, почему это теперь считается ошибкой, когда это был допустимый код С++, а не С++ 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
более подходит для преобразования в и из разных классов, имеет смысл для A
(и других классов, которые хотят быть сериализуемыми), чтобы иметь конструкторы и операторы преобразования, а не ожидать SerializableFormat
до охватывают все типы классов, которые хотят быть сериализуемыми, поэтому изменение SerializableFormat
на наличие специального конструктора не является решением.
Может ли кто-нибудь увидеть, что я делаю неправильно здесь?