Rule A16-6-1 (required, implementation, automated)

#error directive shall not be used.

Rationale

Using the pre-processor #error directive may lead to code that is complicated and not clear for developers. The #error directive can not be applied to templates as it will not be evaluated as a per-instance template deduction. Static assertion, similarly to #error directive, provides a compile-time error checking. However, static_assert behaves correctly in all C++ concepts and makes the code more readable and does not rely on pre-processor directives. Note: “#error” is anyway not allowed, see A16-0-1. This rule is kept in case A16-0-1 is disabled in a project.

Example

// $Id: A16-6-1.cpp 289436 2017-10-04 10:45:23Z michal.szczepankiewicz $
#include <cstdint>
#include <type_traits>
constexpr std::int32_t value = 0;
#if value > 10
#error "Incorrect value" // Non-compliant
#endif
void F1() noexcept
{
static_assert(value <= 10, "Incorrect value"); // Compliant
// ...
}
template <typename T>
void F2(T& a)
{
static_assert(std::is_copy_constructible<T>::value,
"f2() function requires copying");
// Compliant
// ...
}

See also

none