Static Assertion Fails Compilation Despite Null Function Invocation
Using g 4.6.3 with the c 0x flag, developers have encountered an unexpected compilation error:
template <typename T> inline T getValue(AnObject& {}) { static_assert(false, "this function has to be implemented for desired type"); }
Results in:
static_assertion failed "this function has to be implemented for the desired type"
This error occurs despite the function not being invoked anywhere in the code.
Explanation
According to the C standard [temp.res]/8, if no valid specialization can be generated for a template definition that is not instantiated, the template is ill-formed. While the compiler is not obligated to diagnose this error, it is permitted to reject the template.
Resolution
One approach to resolve this issue is to use a type trait to guard the static assertion:
template<typename T> struct foobar : std::false_type { }; template <typename T> inline T getValue(AnObject& {}) { static_assert(foobar<T>::value, "this function has to be implemented for desired type"); }
With this modification, the compiler cannot reject the template immediately as it needs to instantiate the relevant specialization of foobar
The above is the detailed content of Why Does a Static Assertion Fail Compilation Despite a Null Function Invocation?. For more information, please follow other related articles on the PHP Chinese website!