Для тех из вас, кто пытается сбросить греческий или другие «экзотические» языки, такие как я, но также имеют проблемы (ошибки в Unicode) со странными символами, такими как символ мира (\ u262E) или другие, которые часто содержатся в json формирует данные, такие как Twitter, решение может быть следующим: (sort_keys, очевидно, необязательно):
import codecs, json
with codecs.open('data.json', 'w', 'utf8') as f:
f.write(json.dumps(data, sort_keys = True, ensure_ascii=False))
Правила для auto
по большей части такие же, как и для вывода типа шаблона. Приведенный пример работает по той же причине, когда вы можете передавать объекты частных типов в функции шаблона:
template <typename T>
void fun(T t) {}
int main() {
Foo f;
fun(f.Baz()); // ok
}
И почему мы можем передавать объекты частных типов в функции шаблона, спросите вы? Потому что только имя типа недоступно. Сам тип все еще можно использовать, поэтому вы можете вообще вернуть его к клиентскому коду.
Контроль доступа применяется к именам. Сравните этот пример со стандартом:
class A {
class B { };
public:
typedef B BB;
};
void f() {
A::BB x; // OK, typedef name A::BB is public
A::B y; // access error, A::B is private
}
Чтобы добавить к другим (хорошим) ответам, вот пример из C ++ 98, который показывает, что проблема действительно не связана с auto
вообще
class Foo {
struct Bar { int i; };
public:
Bar Baz() { return Bar(); }
void Qaz(Bar) {}
};
int main() {
Foo f;
f.Qaz(f.Baz()); // Ok
// Foo::Bar x = f.Baz();
// f.Qaz(x);
// Error: error: ‘struct Foo::Bar’ is private
}
Использование частный тип не запрещен, он только называет тип. Создание неназванного временного типа такого типа в порядке, например, во всех версиях C ++.
Этот вопрос уже очень хорошо ответил как на холод, так и на R. Martinho Fernandes.
Я просто не мог упустить эту возможность, чтобы ответить на вопрос с аналогией Гарри Поттера:
class Wizard
{
private:
class LordVoldemort
{
void avada_kedavra()
{
// scary stuff
}
};
public:
using HeWhoMustNotBeNamed = LordVoldemort;
};
int main()
{
Wizard::HeWhoMustNotBeNamed tom; // OK
Wizard::LordVoldemort not_allowed; // Not OK
return 0;
}
public: typedef Bar return_type_from_Baz;
в классFoo
в вопросе. Теперь тип может быть идентифицирован публичным именем, несмотря на то, что он определен в частной части класса. – Steve Jessop 23 November 2012 в 18:36private: typedef Bar return_type_from_Baz;
вFoo
, как показано . Идентификаторыtypedef
'd не обращаются к спецификаторам доступа, открытым и закрытым. – damienh 25 November 2012 в 02:54Bar
илиSomeDeducedType
? Не похоже, что я могу использовать его, чтобы добраться до частных членовclass Foo
или чего-то еще. – einpoklum 2 December 2015 в 00:15