Why doesn't my compiler recognise “Bond() = default;”?









up vote
23
down vote

favorite












Please look at this code



class Bond

public:
Bond(int payments_per_year, int period_lengths_in_months);
Bond() = default;

private:
const int payments_per_year;
const int period_length_in_months;
;

int main()

Bond b; // Error here



When attempting to compile I get an error:




error C2280: 'Bond::Bond(void)': attempting to reference a deleted function".




It's not a "rule of 3" violation since I've added the default constructor back.



Why doesn't the compiler recognise Bond() = default;?










share|improve this question









New contributor




Sasidiran Sangamanautram is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 1




    I have other error uninitialized const member in 'const int'. When you initialize constant member no more error produced.
    – serge
    2 days ago






  • 1




    Rule of three violation has got nothing to do with the problem at all, regardless of the presence of a (default) constructor.
    – Konrad Rudolph
    2 days ago






  • 1




    = defaulting a special member doesn't mean that it exists, but that the implicit one is generated. If the implicitly generated one doesn't exist, then you get this.
    – Rakete1111
    2 days ago






  • 3




    Even though we are quite likely to recognize the compiler from the error cited in this case, any question with "why my compiler" would benefit greatly from indicating which compiler, and which version of it.
    – Matthieu M.
    2 days ago










  • Compiler says Dr. No.
    – Glorfindel
    yesterday














up vote
23
down vote

favorite












Please look at this code



class Bond

public:
Bond(int payments_per_year, int period_lengths_in_months);
Bond() = default;

private:
const int payments_per_year;
const int period_length_in_months;
;

int main()

Bond b; // Error here



When attempting to compile I get an error:




error C2280: 'Bond::Bond(void)': attempting to reference a deleted function".




It's not a "rule of 3" violation since I've added the default constructor back.



Why doesn't the compiler recognise Bond() = default;?










share|improve this question









New contributor




Sasidiran Sangamanautram is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.















  • 1




    I have other error uninitialized const member in 'const int'. When you initialize constant member no more error produced.
    – serge
    2 days ago






  • 1




    Rule of three violation has got nothing to do with the problem at all, regardless of the presence of a (default) constructor.
    – Konrad Rudolph
    2 days ago






  • 1




    = defaulting a special member doesn't mean that it exists, but that the implicit one is generated. If the implicitly generated one doesn't exist, then you get this.
    – Rakete1111
    2 days ago






  • 3




    Even though we are quite likely to recognize the compiler from the error cited in this case, any question with "why my compiler" would benefit greatly from indicating which compiler, and which version of it.
    – Matthieu M.
    2 days ago










  • Compiler says Dr. No.
    – Glorfindel
    yesterday












up vote
23
down vote

favorite









up vote
23
down vote

favorite











Please look at this code



class Bond

public:
Bond(int payments_per_year, int period_lengths_in_months);
Bond() = default;

private:
const int payments_per_year;
const int period_length_in_months;
;

int main()

Bond b; // Error here



When attempting to compile I get an error:




error C2280: 'Bond::Bond(void)': attempting to reference a deleted function".




It's not a "rule of 3" violation since I've added the default constructor back.



Why doesn't the compiler recognise Bond() = default;?










share|improve this question









New contributor




Sasidiran Sangamanautram is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











Please look at this code



class Bond

public:
Bond(int payments_per_year, int period_lengths_in_months);
Bond() = default;

private:
const int payments_per_year;
const int period_length_in_months;
;

int main()

Bond b; // Error here



When attempting to compile I get an error:




error C2280: 'Bond::Bond(void)': attempting to reference a deleted function".




It's not a "rule of 3" violation since I've added the default constructor back.



Why doesn't the compiler recognise Bond() = default;?







c++ c++11






share|improve this question









New contributor




Sasidiran Sangamanautram is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.











share|improve this question









New contributor




Sasidiran Sangamanautram is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









share|improve this question




share|improve this question








edited yesterday









Peter Mortensen

13.2k1983111




13.2k1983111






New contributor




Sasidiran Sangamanautram is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.









asked 2 days ago









Sasidiran Sangamanautram

1165




1165




New contributor




Sasidiran Sangamanautram is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.





New contributor





Sasidiran Sangamanautram is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.






Sasidiran Sangamanautram is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.







  • 1




    I have other error uninitialized const member in 'const int'. When you initialize constant member no more error produced.
    – serge
    2 days ago






  • 1




    Rule of three violation has got nothing to do with the problem at all, regardless of the presence of a (default) constructor.
    – Konrad Rudolph
    2 days ago






  • 1




    = defaulting a special member doesn't mean that it exists, but that the implicit one is generated. If the implicitly generated one doesn't exist, then you get this.
    – Rakete1111
    2 days ago






  • 3




    Even though we are quite likely to recognize the compiler from the error cited in this case, any question with "why my compiler" would benefit greatly from indicating which compiler, and which version of it.
    – Matthieu M.
    2 days ago










  • Compiler says Dr. No.
    – Glorfindel
    yesterday












  • 1




    I have other error uninitialized const member in 'const int'. When you initialize constant member no more error produced.
    – serge
    2 days ago






  • 1




    Rule of three violation has got nothing to do with the problem at all, regardless of the presence of a (default) constructor.
    – Konrad Rudolph
    2 days ago






  • 1




    = defaulting a special member doesn't mean that it exists, but that the implicit one is generated. If the implicitly generated one doesn't exist, then you get this.
    – Rakete1111
    2 days ago






  • 3




    Even though we are quite likely to recognize the compiler from the error cited in this case, any question with "why my compiler" would benefit greatly from indicating which compiler, and which version of it.
    – Matthieu M.
    2 days ago










  • Compiler says Dr. No.
    – Glorfindel
    yesterday







1




1




I have other error uninitialized const member in 'const int'. When you initialize constant member no more error produced.
– serge
2 days ago




I have other error uninitialized const member in 'const int'. When you initialize constant member no more error produced.
– serge
2 days ago




1




1




Rule of three violation has got nothing to do with the problem at all, regardless of the presence of a (default) constructor.
– Konrad Rudolph
2 days ago




Rule of three violation has got nothing to do with the problem at all, regardless of the presence of a (default) constructor.
– Konrad Rudolph
2 days ago




1




1




= defaulting a special member doesn't mean that it exists, but that the implicit one is generated. If the implicitly generated one doesn't exist, then you get this.
– Rakete1111
2 days ago




= defaulting a special member doesn't mean that it exists, but that the implicit one is generated. If the implicitly generated one doesn't exist, then you get this.
– Rakete1111
2 days ago




3




3




Even though we are quite likely to recognize the compiler from the error cited in this case, any question with "why my compiler" would benefit greatly from indicating which compiler, and which version of it.
– Matthieu M.
2 days ago




Even though we are quite likely to recognize the compiler from the error cited in this case, any question with "why my compiler" would benefit greatly from indicating which compiler, and which version of it.
– Matthieu M.
2 days ago












Compiler says Dr. No.
– Glorfindel
yesterday




Compiler says Dr. No.
– Glorfindel
yesterday












3 Answers
3






active

oldest

votes

















up vote
45
down vote













The default constructor is suppressed since there are constant members that need to be explicitly initialised.



Therefore, due to that suppression, writing Bond() = default does not reintroduce the default constructor.



(You can see this effect by removing all the constructors in the class - you still can't instantiate a b.)



If you drop the const from the members then all will be well.






share|improve this answer



























    up vote
    21
    down vote













    Another fix, is to specify a default value in the declaration of the constants:



    const int payments_per_year = 12;


    This can still be overridden by the valued constructor, but allows the default constructor to proceed.



    This is also a very flexible way to simplify your multiple constructor cases.






    share|improve this answer




















    • Do we need the braces?
      – Paul Sanders
      2 days ago






    • 2




      Equals and braces is definitely weird. Not sure what it actually means. Init from an initializer_list? Anyway: in-class member initializers are – well – initializers, and the syntax rules for initialization apply. That means either = or .
      – besc
      2 days ago






    • 6




      @PaulSanders no, you don't need braces but uniform initialization has a lot of advantages such as making narrowing conversions ill-formed that it is worth getting used to using them. See my update below.
      – Shafik Yaghmour
      2 days ago







    • 3




      @ShafikYaghmour: You could keep the braces and drop the equal though.
      – Matthieu M.
      2 days ago






    • 1




      @ShafikYaghmour: Yep, and that's part of the reason why I much prefer your answer (the other being actual standard quotes).
      – Matthieu M.
      9 hours ago

















    up vote
    11
    down vote













    You are being affected by section [class.default.ctor]p2 of the draft C++ standard (or [class.ctor]p5 in C++11) which says:




    A defaulted default constructor for class X is defined as deleted if:



    ...
    - any non-variant non-static data member of const-qualified type (or array thereof) with no brace-or-equal-initializer does not have a user-provided default constructor,



    ...




    They possible key to fixing your issue is with the phrase with no brace-or-equal-initializer so if you provide brace-or-equal-initializer that will fix your issue e.g.:



    const int payments_per_year12;
    const int period_length_in_months48;


    brace-or-equal-initializer does not require braces, we can see this the grammar:



    brace-or-equal-initializer:
    = initializer-clause
    braced-init-list


    but using uniform initialization has some advantages such as making narrowing conversions ill-formed that it is worth getting used to using them.



    Both gcc and clang provide more meaningful diagnostics for this see the live godbolt session. Sometimes it can be helpful to try your code on multiple compilers, especially if you have a minimal test case like this e.g. clang says:



     warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
    Bond() = default;
    ^
    note: default constructor of 'Bond' is implicitly deleted because field 'payments_per_year' of const-qualified type 'const int' would not be initialized
    const int payments_per_year;
    ^
    ...





    share|improve this answer






















    • It may be worth filing a bug report, the diagnostic could be more meaningful.
      – Shafik Yaghmour
      2 days ago










    • Some examples of [uniform initialization catching bugs that came up recently](twitter.com/shafikyaghmour/status/1058737227184844800
      – Shafik Yaghmour
      2 days ago










    Your Answer






    StackExchange.ifUsing("editor", function ()
    StackExchange.using("externalEditor", function ()
    StackExchange.using("snippets", function ()
    StackExchange.snippets.init();
    );
    );
    , "code-snippets");

    StackExchange.ready(function()
    var channelOptions =
    tags: "".split(" "),
    id: "1"
    ;
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function()
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled)
    StackExchange.using("snippets", function()
    createEditor();
    );

    else
    createEditor();

    );

    function createEditor()
    StackExchange.prepareEditor(
    heartbeatType: 'answer',
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader:
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    ,
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    );



    );






    Sasidiran Sangamanautram is a new contributor. Be nice, and check out our Code of Conduct.









     

    draft saved


    draft discarded


















    StackExchange.ready(
    function ()
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53225106%2fwhy-doesnt-my-compiler-recognise-bond-default%23new-answer', 'question_page');

    );

    Post as a guest






























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes








    up vote
    45
    down vote













    The default constructor is suppressed since there are constant members that need to be explicitly initialised.



    Therefore, due to that suppression, writing Bond() = default does not reintroduce the default constructor.



    (You can see this effect by removing all the constructors in the class - you still can't instantiate a b.)



    If you drop the const from the members then all will be well.






    share|improve this answer
























      up vote
      45
      down vote













      The default constructor is suppressed since there are constant members that need to be explicitly initialised.



      Therefore, due to that suppression, writing Bond() = default does not reintroduce the default constructor.



      (You can see this effect by removing all the constructors in the class - you still can't instantiate a b.)



      If you drop the const from the members then all will be well.






      share|improve this answer






















        up vote
        45
        down vote










        up vote
        45
        down vote









        The default constructor is suppressed since there are constant members that need to be explicitly initialised.



        Therefore, due to that suppression, writing Bond() = default does not reintroduce the default constructor.



        (You can see this effect by removing all the constructors in the class - you still can't instantiate a b.)



        If you drop the const from the members then all will be well.






        share|improve this answer












        The default constructor is suppressed since there are constant members that need to be explicitly initialised.



        Therefore, due to that suppression, writing Bond() = default does not reintroduce the default constructor.



        (You can see this effect by removing all the constructors in the class - you still can't instantiate a b.)



        If you drop the const from the members then all will be well.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 2 days ago









        Bathsheba

        172k26241365




        172k26241365






















            up vote
            21
            down vote













            Another fix, is to specify a default value in the declaration of the constants:



            const int payments_per_year = 12;


            This can still be overridden by the valued constructor, but allows the default constructor to proceed.



            This is also a very flexible way to simplify your multiple constructor cases.






            share|improve this answer




















            • Do we need the braces?
              – Paul Sanders
              2 days ago






            • 2




              Equals and braces is definitely weird. Not sure what it actually means. Init from an initializer_list? Anyway: in-class member initializers are – well – initializers, and the syntax rules for initialization apply. That means either = or .
              – besc
              2 days ago






            • 6




              @PaulSanders no, you don't need braces but uniform initialization has a lot of advantages such as making narrowing conversions ill-formed that it is worth getting used to using them. See my update below.
              – Shafik Yaghmour
              2 days ago







            • 3




              @ShafikYaghmour: You could keep the braces and drop the equal though.
              – Matthieu M.
              2 days ago






            • 1




              @ShafikYaghmour: Yep, and that's part of the reason why I much prefer your answer (the other being actual standard quotes).
              – Matthieu M.
              9 hours ago














            up vote
            21
            down vote













            Another fix, is to specify a default value in the declaration of the constants:



            const int payments_per_year = 12;


            This can still be overridden by the valued constructor, but allows the default constructor to proceed.



            This is also a very flexible way to simplify your multiple constructor cases.






            share|improve this answer




















            • Do we need the braces?
              – Paul Sanders
              2 days ago






            • 2




              Equals and braces is definitely weird. Not sure what it actually means. Init from an initializer_list? Anyway: in-class member initializers are – well – initializers, and the syntax rules for initialization apply. That means either = or .
              – besc
              2 days ago






            • 6




              @PaulSanders no, you don't need braces but uniform initialization has a lot of advantages such as making narrowing conversions ill-formed that it is worth getting used to using them. See my update below.
              – Shafik Yaghmour
              2 days ago







            • 3




              @ShafikYaghmour: You could keep the braces and drop the equal though.
              – Matthieu M.
              2 days ago






            • 1




              @ShafikYaghmour: Yep, and that's part of the reason why I much prefer your answer (the other being actual standard quotes).
              – Matthieu M.
              9 hours ago












            up vote
            21
            down vote










            up vote
            21
            down vote









            Another fix, is to specify a default value in the declaration of the constants:



            const int payments_per_year = 12;


            This can still be overridden by the valued constructor, but allows the default constructor to proceed.



            This is also a very flexible way to simplify your multiple constructor cases.






            share|improve this answer












            Another fix, is to specify a default value in the declaration of the constants:



            const int payments_per_year = 12;


            This can still be overridden by the valued constructor, but allows the default constructor to proceed.



            This is also a very flexible way to simplify your multiple constructor cases.







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered 2 days ago









            Gem Taylor

            1,680216




            1,680216











            • Do we need the braces?
              – Paul Sanders
              2 days ago






            • 2




              Equals and braces is definitely weird. Not sure what it actually means. Init from an initializer_list? Anyway: in-class member initializers are – well – initializers, and the syntax rules for initialization apply. That means either = or .
              – besc
              2 days ago






            • 6




              @PaulSanders no, you don't need braces but uniform initialization has a lot of advantages such as making narrowing conversions ill-formed that it is worth getting used to using them. See my update below.
              – Shafik Yaghmour
              2 days ago







            • 3




              @ShafikYaghmour: You could keep the braces and drop the equal though.
              – Matthieu M.
              2 days ago






            • 1




              @ShafikYaghmour: Yep, and that's part of the reason why I much prefer your answer (the other being actual standard quotes).
              – Matthieu M.
              9 hours ago
















            • Do we need the braces?
              – Paul Sanders
              2 days ago






            • 2




              Equals and braces is definitely weird. Not sure what it actually means. Init from an initializer_list? Anyway: in-class member initializers are – well – initializers, and the syntax rules for initialization apply. That means either = or .
              – besc
              2 days ago






            • 6




              @PaulSanders no, you don't need braces but uniform initialization has a lot of advantages such as making narrowing conversions ill-formed that it is worth getting used to using them. See my update below.
              – Shafik Yaghmour
              2 days ago







            • 3




              @ShafikYaghmour: You could keep the braces and drop the equal though.
              – Matthieu M.
              2 days ago






            • 1




              @ShafikYaghmour: Yep, and that's part of the reason why I much prefer your answer (the other being actual standard quotes).
              – Matthieu M.
              9 hours ago















            Do we need the braces?
            – Paul Sanders
            2 days ago




            Do we need the braces?
            – Paul Sanders
            2 days ago




            2




            2




            Equals and braces is definitely weird. Not sure what it actually means. Init from an initializer_list? Anyway: in-class member initializers are – well – initializers, and the syntax rules for initialization apply. That means either = or .
            – besc
            2 days ago




            Equals and braces is definitely weird. Not sure what it actually means. Init from an initializer_list? Anyway: in-class member initializers are – well – initializers, and the syntax rules for initialization apply. That means either = or .
            – besc
            2 days ago




            6




            6




            @PaulSanders no, you don't need braces but uniform initialization has a lot of advantages such as making narrowing conversions ill-formed that it is worth getting used to using them. See my update below.
            – Shafik Yaghmour
            2 days ago





            @PaulSanders no, you don't need braces but uniform initialization has a lot of advantages such as making narrowing conversions ill-formed that it is worth getting used to using them. See my update below.
            – Shafik Yaghmour
            2 days ago





            3




            3




            @ShafikYaghmour: You could keep the braces and drop the equal though.
            – Matthieu M.
            2 days ago




            @ShafikYaghmour: You could keep the braces and drop the equal though.
            – Matthieu M.
            2 days ago




            1




            1




            @ShafikYaghmour: Yep, and that's part of the reason why I much prefer your answer (the other being actual standard quotes).
            – Matthieu M.
            9 hours ago




            @ShafikYaghmour: Yep, and that's part of the reason why I much prefer your answer (the other being actual standard quotes).
            – Matthieu M.
            9 hours ago










            up vote
            11
            down vote













            You are being affected by section [class.default.ctor]p2 of the draft C++ standard (or [class.ctor]p5 in C++11) which says:




            A defaulted default constructor for class X is defined as deleted if:



            ...
            - any non-variant non-static data member of const-qualified type (or array thereof) with no brace-or-equal-initializer does not have a user-provided default constructor,



            ...




            They possible key to fixing your issue is with the phrase with no brace-or-equal-initializer so if you provide brace-or-equal-initializer that will fix your issue e.g.:



            const int payments_per_year12;
            const int period_length_in_months48;


            brace-or-equal-initializer does not require braces, we can see this the grammar:



            brace-or-equal-initializer:
            = initializer-clause
            braced-init-list


            but using uniform initialization has some advantages such as making narrowing conversions ill-formed that it is worth getting used to using them.



            Both gcc and clang provide more meaningful diagnostics for this see the live godbolt session. Sometimes it can be helpful to try your code on multiple compilers, especially if you have a minimal test case like this e.g. clang says:



             warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
            Bond() = default;
            ^
            note: default constructor of 'Bond' is implicitly deleted because field 'payments_per_year' of const-qualified type 'const int' would not be initialized
            const int payments_per_year;
            ^
            ...





            share|improve this answer






















            • It may be worth filing a bug report, the diagnostic could be more meaningful.
              – Shafik Yaghmour
              2 days ago










            • Some examples of [uniform initialization catching bugs that came up recently](twitter.com/shafikyaghmour/status/1058737227184844800
              – Shafik Yaghmour
              2 days ago














            up vote
            11
            down vote













            You are being affected by section [class.default.ctor]p2 of the draft C++ standard (or [class.ctor]p5 in C++11) which says:




            A defaulted default constructor for class X is defined as deleted if:



            ...
            - any non-variant non-static data member of const-qualified type (or array thereof) with no brace-or-equal-initializer does not have a user-provided default constructor,



            ...




            They possible key to fixing your issue is with the phrase with no brace-or-equal-initializer so if you provide brace-or-equal-initializer that will fix your issue e.g.:



            const int payments_per_year12;
            const int period_length_in_months48;


            brace-or-equal-initializer does not require braces, we can see this the grammar:



            brace-or-equal-initializer:
            = initializer-clause
            braced-init-list


            but using uniform initialization has some advantages such as making narrowing conversions ill-formed that it is worth getting used to using them.



            Both gcc and clang provide more meaningful diagnostics for this see the live godbolt session. Sometimes it can be helpful to try your code on multiple compilers, especially if you have a minimal test case like this e.g. clang says:



             warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
            Bond() = default;
            ^
            note: default constructor of 'Bond' is implicitly deleted because field 'payments_per_year' of const-qualified type 'const int' would not be initialized
            const int payments_per_year;
            ^
            ...





            share|improve this answer






















            • It may be worth filing a bug report, the diagnostic could be more meaningful.
              – Shafik Yaghmour
              2 days ago










            • Some examples of [uniform initialization catching bugs that came up recently](twitter.com/shafikyaghmour/status/1058737227184844800
              – Shafik Yaghmour
              2 days ago












            up vote
            11
            down vote










            up vote
            11
            down vote









            You are being affected by section [class.default.ctor]p2 of the draft C++ standard (or [class.ctor]p5 in C++11) which says:




            A defaulted default constructor for class X is defined as deleted if:



            ...
            - any non-variant non-static data member of const-qualified type (or array thereof) with no brace-or-equal-initializer does not have a user-provided default constructor,



            ...




            They possible key to fixing your issue is with the phrase with no brace-or-equal-initializer so if you provide brace-or-equal-initializer that will fix your issue e.g.:



            const int payments_per_year12;
            const int period_length_in_months48;


            brace-or-equal-initializer does not require braces, we can see this the grammar:



            brace-or-equal-initializer:
            = initializer-clause
            braced-init-list


            but using uniform initialization has some advantages such as making narrowing conversions ill-formed that it is worth getting used to using them.



            Both gcc and clang provide more meaningful diagnostics for this see the live godbolt session. Sometimes it can be helpful to try your code on multiple compilers, especially if you have a minimal test case like this e.g. clang says:



             warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
            Bond() = default;
            ^
            note: default constructor of 'Bond' is implicitly deleted because field 'payments_per_year' of const-qualified type 'const int' would not be initialized
            const int payments_per_year;
            ^
            ...





            share|improve this answer














            You are being affected by section [class.default.ctor]p2 of the draft C++ standard (or [class.ctor]p5 in C++11) which says:




            A defaulted default constructor for class X is defined as deleted if:



            ...
            - any non-variant non-static data member of const-qualified type (or array thereof) with no brace-or-equal-initializer does not have a user-provided default constructor,



            ...




            They possible key to fixing your issue is with the phrase with no brace-or-equal-initializer so if you provide brace-or-equal-initializer that will fix your issue e.g.:



            const int payments_per_year12;
            const int period_length_in_months48;


            brace-or-equal-initializer does not require braces, we can see this the grammar:



            brace-or-equal-initializer:
            = initializer-clause
            braced-init-list


            but using uniform initialization has some advantages such as making narrowing conversions ill-formed that it is worth getting used to using them.



            Both gcc and clang provide more meaningful diagnostics for this see the live godbolt session. Sometimes it can be helpful to try your code on multiple compilers, especially if you have a minimal test case like this e.g. clang says:



             warning: explicitly defaulted default constructor is implicitly deleted [-Wdefaulted-function-deleted]
            Bond() = default;
            ^
            note: default constructor of 'Bond' is implicitly deleted because field 'payments_per_year' of const-qualified type 'const int' would not be initialized
            const int payments_per_year;
            ^
            ...






            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 2 days ago

























            answered 2 days ago









            Shafik Yaghmour

            122k23304504




            122k23304504











            • It may be worth filing a bug report, the diagnostic could be more meaningful.
              – Shafik Yaghmour
              2 days ago










            • Some examples of [uniform initialization catching bugs that came up recently](twitter.com/shafikyaghmour/status/1058737227184844800
              – Shafik Yaghmour
              2 days ago
















            • It may be worth filing a bug report, the diagnostic could be more meaningful.
              – Shafik Yaghmour
              2 days ago










            • Some examples of [uniform initialization catching bugs that came up recently](twitter.com/shafikyaghmour/status/1058737227184844800
              – Shafik Yaghmour
              2 days ago















            It may be worth filing a bug report, the diagnostic could be more meaningful.
            – Shafik Yaghmour
            2 days ago




            It may be worth filing a bug report, the diagnostic could be more meaningful.
            – Shafik Yaghmour
            2 days ago












            Some examples of [uniform initialization catching bugs that came up recently](twitter.com/shafikyaghmour/status/1058737227184844800
            – Shafik Yaghmour
            2 days ago




            Some examples of [uniform initialization catching bugs that came up recently](twitter.com/shafikyaghmour/status/1058737227184844800
            – Shafik Yaghmour
            2 days ago










            Sasidiran Sangamanautram is a new contributor. Be nice, and check out our Code of Conduct.









             

            draft saved


            draft discarded


















            Sasidiran Sangamanautram is a new contributor. Be nice, and check out our Code of Conduct.












            Sasidiran Sangamanautram is a new contributor. Be nice, and check out our Code of Conduct.











            Sasidiran Sangamanautram is a new contributor. Be nice, and check out our Code of Conduct.













             


            draft saved


            draft discarded














            StackExchange.ready(
            function ()
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53225106%2fwhy-doesnt-my-compiler-recognise-bond-default%23new-answer', 'question_page');

            );

            Post as a guest














































































            這個網誌中的熱門文章

            What does pagestruct do in Eviews?

            Dutch intervention in Lombok and Karangasem

            Channel Islands