X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=docs%2FCodingStandards.rst;h=8c8110d033210d7d5e58736782ebb62c3dbae98e;hb=d15319f75f537a806f85f616a84423d63fa1b3d1;hp=aeaee0d6921bd21b7ce117f717e4c04958077dfd;hpb=1114203a73be3c71ce315c1dbb4f1553a119a312;p=oota-llvm.git diff --git a/docs/CodingStandards.rst b/docs/CodingStandards.rst index aeaee0d6921..8c8110d0332 100644 --- a/docs/CodingStandards.rst +++ b/docs/CodingStandards.rst @@ -129,6 +129,14 @@ unlikely to be supported by our host compilers. * But not defaulted move constructors or move assignment operators, MSVC 2013 cannot synthesize them. +* Initializer lists: N2627_ +* Delegating constructors: N1986_ +* Default member initializers (non-static data member initializers): N2756_ + + * Only use these for scalar members that would otherwise be left + uninitialized. Non-scalar members generally have appropriate default + constructors, and MSVC 2013 has problems when braced initializer lists are + involved. .. _N2118: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2118.html .. _N2439: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2439.htm @@ -152,7 +160,9 @@ unlikely to be supported by our host compilers. .. _N2242: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2242.pdf .. _N2437: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2437.pdf .. _N2346: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2346.htm -.. _MSVC-compatible RTTI: http://llvm.org/PR18951 +.. _N2627: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2672.htm +.. _N1986: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1986.pdf +.. _N2756: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2756.htm The supported features in the C++11 standard libraries are less well tracked, but also much greater. Most of the standard libraries implement most of C++11's @@ -168,9 +178,6 @@ being aware of: * While most of the atomics library is well implemented, the fences are missing. Fortunately, they are rarely needed. * The locale support is incomplete. -* ``std::initializer_list`` (and the constructors and functions that take it as - an argument) are not always available, so you cannot (for example) initialize - a ``std::vector`` with a braced initializer list. * ``std::equal()`` (and other algorithms) incorrectly assert in MSVC when given ``nullptr`` as an iterator. @@ -721,7 +728,7 @@ the symbol (e.g., MSVC). This can lead to problems at link time. // Bar isn't POD, but it does look like a struct. struct Bar { int Data; - Foo() : Data(0) { } + Bar() : Data(0) { } }; Do not use Braced Initializer Lists to Call a Constructor @@ -1301,34 +1308,6 @@ that the enum expression may take any representable value, not just those of individual enumerators. To suppress this warning, use ``llvm_unreachable`` after the switch. -Use ``LLVM_DELETED_FUNCTION`` to mark uncallable methods -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -Prior to C++11, a common pattern to make a class uncopyable was to declare an -unimplemented copy constructor and copy assignment operator and make them -private. This would give a compiler error for accessing a private method or a -linker error because it wasn't implemented. - -With C++11, we can mark methods that won't be implemented with ``= delete``. -This will trigger a much better error message and tell the compiler that the -method will never be implemented. This enables other checks like -``-Wunused-private-field`` to run correctly on classes that contain these -methods. - -For compatibility with MSVC, ``LLVM_DELETED_FUNCTION`` should be used which -will expand to ``= delete`` on compilers that support it. These methods should -still be declared private. Example of the uncopyable pattern: - -.. code-block:: c++ - - class DontCopy { - private: - DontCopy(const DontCopy&) LLVM_DELETED_FUNCTION; - DontCopy &operator =(const DontCopy&) LLVM_DELETED_FUNCTION; - public: - ... - }; - Don't evaluate ``end()`` every time through a loop ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^