Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why is that noexcept specifier doesn't work in complete class context but default argument and function body does

I'm learning C++ using the books listed here. In particular, I read about complete-class context and came to know that it includes function-body, default argument, noexcept-specifier etc. Now, to further clear my understanding of the topic, I wrote the following program where #1 and #2 works but #3 fails. I don't know why #3 fails because I read that all the three(function body, default argument and noexcept specifier) are included in the complete-class context.

struct A {
   constexpr static bool func() 
   { 
       return true; 
   }
   //--------------vvvvvv------->works as expected   #1
   void f(bool V1 = func())
   { 
      bool V2 = func(); //works as expected          #2
   }
   //-----------------vvvvvv---->DOESN'T WORK?       #3
   void g()  noexcept(func()) 
   {
      ;
   }

};

A complete-class context of a class is a

  • function body
  • default argument
  • noexcept specifier

As you can see the third point says "noexcept specifier" so i expected #3 to works as well but it doesn't.

So my question is why #3 doesn't work unlike #1 and #2? Demo

GCC gives the error with #3:

 error: 'static constexpr bool A::func()' called in a constant expression before its definition is complete
   20 |    void g()  noexcept(func())

Clang gives:

error: noexcept specifier argument is not a constant expression
   void g()  noexcept(func()) 
                      ^~~~~~
<source>:20:23: note: undefined function 'func' cannot be used in a constant expression
<source>:10:26: note: declared here
   constexpr static bool func() 

MSVC gives:

 error C2131: expression did not evaluate to a constant
<source>(20): note: failure was caused by call of undefined function or one not declared 'constexpr'
<source>(20): note: see usage of 'A::func'

1 Answers

The program is well-formed and all the three compilers are wrong in rejecting the code as noexcept-specifier is included in complete-class context as quoted in the question.

Here are the respective bug reports:

GCC rejects use of static constexpr member function in noexcept complete-class context

Clang rejects use of static constexpr member function in noexcept complete-class context

MSVC rejects use of static constexpr member function in noexcept complete-class context

like image 181
Anoop Rana Avatar answered Oct 24 '25 09:10

Anoop Rana



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!