C++ constexpr function in return statement












10















Why is a constexpr function no evaluated at compile time but in runtime in the return statement of main function?



It tried



template<int x>
constexpr int fac() {
return fac<x - 1>() * x;
}

template<>
constexpr int fac<1>() {
return 1;
}

int main() {
const int x = fac<3>();
return x;
}


and the result is



main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 6
mov eax, 6
pop rbp
ret


with gcc 8.2. But when I call the function in the return statement



template<int x>
constexpr int fac() {
return fac<x - 1>() * x;
}

template<>
constexpr int fac<1>() {
return 1;
}

int main() {
return fac<3>();
}


I get



int fac<1>():
push rbp
mov rbp, rsp
mov eax, 1
pop rbp
ret
main:
push rbp
mov rbp, rsp
call int fac<3>()
nop
pop rbp
ret
int fac<2>():
push rbp
mov rbp, rsp
call int fac<1>()
add eax, eax
pop rbp
ret
int fac<3>():
push rbp
mov rbp, rsp
call int fac<2>()
mov edx, eax
mov eax, edx
add eax, eax
add eax, edx
pop rbp
ret


Why is the first code evaluated at compile time and the second at runtime?



Also I tried both snippets with clang 7.0.0 and they are evaluated at runtime. Why is this not valid constexpr for clang?



All evaluation was done in godbolt compiler explorer.










share|improve this question




















  • 14





    You should use -O3 for optimal behaviour, the question is meaningless without it. As posted the question is really about "why does the compiler without optimization do this thing" to which the answer is usually "to make debugging easier"

    – M.M
    5 hours ago








  • 5





    And both compilers in question do exactly what you would expect with optimizations enabled: godbolt.org/z/cCbFDX

    – Max Langhof
    5 hours ago






  • 13





    constexpr exists to let you write natural code for producing constant expressions in contexts that need them. It's not a "optimize this to heck always" hint to the compiler. It's best not to confuse it for one.

    – StoryTeller
    5 hours ago













  • Always turn on optimizations, regardless of the compiler. Too many questions on "why is C++ slow compared to <fill in the language>", or "why C++ generates this code when ...", get closed due to not testing or building with optimizations turned on. You should also post the compiler options used to test the code.

    – PaulMcKenzie
    5 hours ago








  • 2





    @StoryTeller that comment helped me more than thousands books. I think you should make it an answer. I always thought constexpr is to tell the compiler "this should be evaluated at compile time", while I now understand that it is rather "this must be evaluatable at compile time". Suddenly the confusion about whether it does get evaluated at compile time or not feels much less severe.

    – user463035818
    5 hours ago


















10















Why is a constexpr function no evaluated at compile time but in runtime in the return statement of main function?



It tried



template<int x>
constexpr int fac() {
return fac<x - 1>() * x;
}

template<>
constexpr int fac<1>() {
return 1;
}

int main() {
const int x = fac<3>();
return x;
}


and the result is



main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 6
mov eax, 6
pop rbp
ret


with gcc 8.2. But when I call the function in the return statement



template<int x>
constexpr int fac() {
return fac<x - 1>() * x;
}

template<>
constexpr int fac<1>() {
return 1;
}

int main() {
return fac<3>();
}


I get



int fac<1>():
push rbp
mov rbp, rsp
mov eax, 1
pop rbp
ret
main:
push rbp
mov rbp, rsp
call int fac<3>()
nop
pop rbp
ret
int fac<2>():
push rbp
mov rbp, rsp
call int fac<1>()
add eax, eax
pop rbp
ret
int fac<3>():
push rbp
mov rbp, rsp
call int fac<2>()
mov edx, eax
mov eax, edx
add eax, eax
add eax, edx
pop rbp
ret


Why is the first code evaluated at compile time and the second at runtime?



Also I tried both snippets with clang 7.0.0 and they are evaluated at runtime. Why is this not valid constexpr for clang?



All evaluation was done in godbolt compiler explorer.










share|improve this question




















  • 14





    You should use -O3 for optimal behaviour, the question is meaningless without it. As posted the question is really about "why does the compiler without optimization do this thing" to which the answer is usually "to make debugging easier"

    – M.M
    5 hours ago








  • 5





    And both compilers in question do exactly what you would expect with optimizations enabled: godbolt.org/z/cCbFDX

    – Max Langhof
    5 hours ago






  • 13





    constexpr exists to let you write natural code for producing constant expressions in contexts that need them. It's not a "optimize this to heck always" hint to the compiler. It's best not to confuse it for one.

    – StoryTeller
    5 hours ago













  • Always turn on optimizations, regardless of the compiler. Too many questions on "why is C++ slow compared to <fill in the language>", or "why C++ generates this code when ...", get closed due to not testing or building with optimizations turned on. You should also post the compiler options used to test the code.

    – PaulMcKenzie
    5 hours ago








  • 2





    @StoryTeller that comment helped me more than thousands books. I think you should make it an answer. I always thought constexpr is to tell the compiler "this should be evaluated at compile time", while I now understand that it is rather "this must be evaluatable at compile time". Suddenly the confusion about whether it does get evaluated at compile time or not feels much less severe.

    – user463035818
    5 hours ago
















10












10








10


2






Why is a constexpr function no evaluated at compile time but in runtime in the return statement of main function?



It tried



template<int x>
constexpr int fac() {
return fac<x - 1>() * x;
}

template<>
constexpr int fac<1>() {
return 1;
}

int main() {
const int x = fac<3>();
return x;
}


and the result is



main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 6
mov eax, 6
pop rbp
ret


with gcc 8.2. But when I call the function in the return statement



template<int x>
constexpr int fac() {
return fac<x - 1>() * x;
}

template<>
constexpr int fac<1>() {
return 1;
}

int main() {
return fac<3>();
}


I get



int fac<1>():
push rbp
mov rbp, rsp
mov eax, 1
pop rbp
ret
main:
push rbp
mov rbp, rsp
call int fac<3>()
nop
pop rbp
ret
int fac<2>():
push rbp
mov rbp, rsp
call int fac<1>()
add eax, eax
pop rbp
ret
int fac<3>():
push rbp
mov rbp, rsp
call int fac<2>()
mov edx, eax
mov eax, edx
add eax, eax
add eax, edx
pop rbp
ret


Why is the first code evaluated at compile time and the second at runtime?



Also I tried both snippets with clang 7.0.0 and they are evaluated at runtime. Why is this not valid constexpr for clang?



All evaluation was done in godbolt compiler explorer.










share|improve this question
















Why is a constexpr function no evaluated at compile time but in runtime in the return statement of main function?



It tried



template<int x>
constexpr int fac() {
return fac<x - 1>() * x;
}

template<>
constexpr int fac<1>() {
return 1;
}

int main() {
const int x = fac<3>();
return x;
}


and the result is



main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 6
mov eax, 6
pop rbp
ret


with gcc 8.2. But when I call the function in the return statement



template<int x>
constexpr int fac() {
return fac<x - 1>() * x;
}

template<>
constexpr int fac<1>() {
return 1;
}

int main() {
return fac<3>();
}


I get



int fac<1>():
push rbp
mov rbp, rsp
mov eax, 1
pop rbp
ret
main:
push rbp
mov rbp, rsp
call int fac<3>()
nop
pop rbp
ret
int fac<2>():
push rbp
mov rbp, rsp
call int fac<1>()
add eax, eax
pop rbp
ret
int fac<3>():
push rbp
mov rbp, rsp
call int fac<2>()
mov edx, eax
mov eax, edx
add eax, eax
add eax, edx
pop rbp
ret


Why is the first code evaluated at compile time and the second at runtime?



Also I tried both snippets with clang 7.0.0 and they are evaluated at runtime. Why is this not valid constexpr for clang?



All evaluation was done in godbolt compiler explorer.







c++ gcc clang constexpr






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 4 hours ago







Thomas Sablik

















asked 5 hours ago









Thomas SablikThomas Sablik

2,51111028




2,51111028








  • 14





    You should use -O3 for optimal behaviour, the question is meaningless without it. As posted the question is really about "why does the compiler without optimization do this thing" to which the answer is usually "to make debugging easier"

    – M.M
    5 hours ago








  • 5





    And both compilers in question do exactly what you would expect with optimizations enabled: godbolt.org/z/cCbFDX

    – Max Langhof
    5 hours ago






  • 13





    constexpr exists to let you write natural code for producing constant expressions in contexts that need them. It's not a "optimize this to heck always" hint to the compiler. It's best not to confuse it for one.

    – StoryTeller
    5 hours ago













  • Always turn on optimizations, regardless of the compiler. Too many questions on "why is C++ slow compared to <fill in the language>", or "why C++ generates this code when ...", get closed due to not testing or building with optimizations turned on. You should also post the compiler options used to test the code.

    – PaulMcKenzie
    5 hours ago








  • 2





    @StoryTeller that comment helped me more than thousands books. I think you should make it an answer. I always thought constexpr is to tell the compiler "this should be evaluated at compile time", while I now understand that it is rather "this must be evaluatable at compile time". Suddenly the confusion about whether it does get evaluated at compile time or not feels much less severe.

    – user463035818
    5 hours ago
















  • 14





    You should use -O3 for optimal behaviour, the question is meaningless without it. As posted the question is really about "why does the compiler without optimization do this thing" to which the answer is usually "to make debugging easier"

    – M.M
    5 hours ago








  • 5





    And both compilers in question do exactly what you would expect with optimizations enabled: godbolt.org/z/cCbFDX

    – Max Langhof
    5 hours ago






  • 13





    constexpr exists to let you write natural code for producing constant expressions in contexts that need them. It's not a "optimize this to heck always" hint to the compiler. It's best not to confuse it for one.

    – StoryTeller
    5 hours ago













  • Always turn on optimizations, regardless of the compiler. Too many questions on "why is C++ slow compared to <fill in the language>", or "why C++ generates this code when ...", get closed due to not testing or building with optimizations turned on. You should also post the compiler options used to test the code.

    – PaulMcKenzie
    5 hours ago








  • 2





    @StoryTeller that comment helped me more than thousands books. I think you should make it an answer. I always thought constexpr is to tell the compiler "this should be evaluated at compile time", while I now understand that it is rather "this must be evaluatable at compile time". Suddenly the confusion about whether it does get evaluated at compile time or not feels much less severe.

    – user463035818
    5 hours ago










14




14





You should use -O3 for optimal behaviour, the question is meaningless without it. As posted the question is really about "why does the compiler without optimization do this thing" to which the answer is usually "to make debugging easier"

– M.M
5 hours ago







You should use -O3 for optimal behaviour, the question is meaningless without it. As posted the question is really about "why does the compiler without optimization do this thing" to which the answer is usually "to make debugging easier"

– M.M
5 hours ago






5




5





And both compilers in question do exactly what you would expect with optimizations enabled: godbolt.org/z/cCbFDX

– Max Langhof
5 hours ago





And both compilers in question do exactly what you would expect with optimizations enabled: godbolt.org/z/cCbFDX

– Max Langhof
5 hours ago




13




13





constexpr exists to let you write natural code for producing constant expressions in contexts that need them. It's not a "optimize this to heck always" hint to the compiler. It's best not to confuse it for one.

– StoryTeller
5 hours ago







constexpr exists to let you write natural code for producing constant expressions in contexts that need them. It's not a "optimize this to heck always" hint to the compiler. It's best not to confuse it for one.

– StoryTeller
5 hours ago















Always turn on optimizations, regardless of the compiler. Too many questions on "why is C++ slow compared to <fill in the language>", or "why C++ generates this code when ...", get closed due to not testing or building with optimizations turned on. You should also post the compiler options used to test the code.

– PaulMcKenzie
5 hours ago







Always turn on optimizations, regardless of the compiler. Too many questions on "why is C++ slow compared to <fill in the language>", or "why C++ generates this code when ...", get closed due to not testing or building with optimizations turned on. You should also post the compiler options used to test the code.

– PaulMcKenzie
5 hours ago






2




2





@StoryTeller that comment helped me more than thousands books. I think you should make it an answer. I always thought constexpr is to tell the compiler "this should be evaluated at compile time", while I now understand that it is rather "this must be evaluatable at compile time". Suddenly the confusion about whether it does get evaluated at compile time or not feels much less severe.

– user463035818
5 hours ago







@StoryTeller that comment helped me more than thousands books. I think you should make it an answer. I always thought constexpr is to tell the compiler "this should be evaluated at compile time", while I now understand that it is rather "this must be evaluatable at compile time". Suddenly the confusion about whether it does get evaluated at compile time or not feels much less severe.

– user463035818
5 hours ago














2 Answers
2






active

oldest

votes


















15














A common misconception with regard to constexpr is that it means "this will be evaluated at compile time"1.



It is not. constexpr was introduced to let us write natural code that may produce constant expressions in contexts that need them. It means "this must be evaluatable at compile time", which is what the compiler will check.



So if you wrote a constexpr function returning an int, you can use it to calculate a template argument, an initializer for a constexpr variable (also const if it's an integral type) or an array size. You can use the function to obtain natural, declarative, readable code instead of the old meta-programming tricks one needed to resort to in the past.



But a constexpr function is still a regular function. The constexpr specifier doesn't mean a compiler has2 to optimize it to heck and do constant folding at compile time. It's best not to confuse it for such a hint.





1 - Thanks user463035818 for the phrasing.
2 - c++20 and consteval is a different story however :)






share|improve this answer

































    9














    StoryTeller's answer is good, but I think there's a slightly different take possible.



    With constexpr, there are three situations to distinguish:




    1. The result is needed in a compile-time context, such as array sizes. In this case, the arguments too must be known at compile time. Evaluation is probably at compile time, and at least all diagnosable errors will be found at compile time.


    2. The arguments are only known at run time, and the result is not needed at compile time. In this case, evaluation necessarily has to happen at run time.


    3. The arguments may be available at compile time, but the result is needed only at run time.



    The fourth combination (arguments available only at runtime, result needed at compile time) is an error; the compiler will reject such code.



    Now in cases 1 and 3 the calculation could happen at compile time, as all inputs are available. But to facilitate case 2, the compiler must be able to create a run-time version, and it may decide to use this variant in the other cases as well - if it can.



    E.g. some compilers internally support variable-sized arrays, so even while the language requires compile-time array bounds, the implementation may decide not to.






    share|improve this answer
























    • Shouldn't case 2 lead to a compilation error instead? The constexpr indicates that the expression must be evaluable at compile time.

      – fishinear
      32 mins ago











    • @fishinear No. The answer is referring to a the uses of a constexpr function. E.g. if I have constexpr int factorial(int n), and I have an int input I only know at runtime, int output = factorial(input); is perfectly fine. The error would be claiming constexpr int output = factorial(input);, because input is not constexpr, so neither can output be constexpr.

      – HTNW
      3 mins 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',
    autoActivateHeartbeat: false,
    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
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54181797%2fc-constexpr-function-in-return-statement%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    15














    A common misconception with regard to constexpr is that it means "this will be evaluated at compile time"1.



    It is not. constexpr was introduced to let us write natural code that may produce constant expressions in contexts that need them. It means "this must be evaluatable at compile time", which is what the compiler will check.



    So if you wrote a constexpr function returning an int, you can use it to calculate a template argument, an initializer for a constexpr variable (also const if it's an integral type) or an array size. You can use the function to obtain natural, declarative, readable code instead of the old meta-programming tricks one needed to resort to in the past.



    But a constexpr function is still a regular function. The constexpr specifier doesn't mean a compiler has2 to optimize it to heck and do constant folding at compile time. It's best not to confuse it for such a hint.





    1 - Thanks user463035818 for the phrasing.
    2 - c++20 and consteval is a different story however :)






    share|improve this answer






























      15














      A common misconception with regard to constexpr is that it means "this will be evaluated at compile time"1.



      It is not. constexpr was introduced to let us write natural code that may produce constant expressions in contexts that need them. It means "this must be evaluatable at compile time", which is what the compiler will check.



      So if you wrote a constexpr function returning an int, you can use it to calculate a template argument, an initializer for a constexpr variable (also const if it's an integral type) or an array size. You can use the function to obtain natural, declarative, readable code instead of the old meta-programming tricks one needed to resort to in the past.



      But a constexpr function is still a regular function. The constexpr specifier doesn't mean a compiler has2 to optimize it to heck and do constant folding at compile time. It's best not to confuse it for such a hint.





      1 - Thanks user463035818 for the phrasing.
      2 - c++20 and consteval is a different story however :)






      share|improve this answer




























        15












        15








        15







        A common misconception with regard to constexpr is that it means "this will be evaluated at compile time"1.



        It is not. constexpr was introduced to let us write natural code that may produce constant expressions in contexts that need them. It means "this must be evaluatable at compile time", which is what the compiler will check.



        So if you wrote a constexpr function returning an int, you can use it to calculate a template argument, an initializer for a constexpr variable (also const if it's an integral type) or an array size. You can use the function to obtain natural, declarative, readable code instead of the old meta-programming tricks one needed to resort to in the past.



        But a constexpr function is still a regular function. The constexpr specifier doesn't mean a compiler has2 to optimize it to heck and do constant folding at compile time. It's best not to confuse it for such a hint.





        1 - Thanks user463035818 for the phrasing.
        2 - c++20 and consteval is a different story however :)






        share|improve this answer















        A common misconception with regard to constexpr is that it means "this will be evaluated at compile time"1.



        It is not. constexpr was introduced to let us write natural code that may produce constant expressions in contexts that need them. It means "this must be evaluatable at compile time", which is what the compiler will check.



        So if you wrote a constexpr function returning an int, you can use it to calculate a template argument, an initializer for a constexpr variable (also const if it's an integral type) or an array size. You can use the function to obtain natural, declarative, readable code instead of the old meta-programming tricks one needed to resort to in the past.



        But a constexpr function is still a regular function. The constexpr specifier doesn't mean a compiler has2 to optimize it to heck and do constant folding at compile time. It's best not to confuse it for such a hint.





        1 - Thanks user463035818 for the phrasing.
        2 - c++20 and consteval is a different story however :)







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 4 hours ago

























        answered 5 hours ago









        StoryTellerStoryTeller

        95k12194258




        95k12194258

























            9














            StoryTeller's answer is good, but I think there's a slightly different take possible.



            With constexpr, there are three situations to distinguish:




            1. The result is needed in a compile-time context, such as array sizes. In this case, the arguments too must be known at compile time. Evaluation is probably at compile time, and at least all diagnosable errors will be found at compile time.


            2. The arguments are only known at run time, and the result is not needed at compile time. In this case, evaluation necessarily has to happen at run time.


            3. The arguments may be available at compile time, but the result is needed only at run time.



            The fourth combination (arguments available only at runtime, result needed at compile time) is an error; the compiler will reject such code.



            Now in cases 1 and 3 the calculation could happen at compile time, as all inputs are available. But to facilitate case 2, the compiler must be able to create a run-time version, and it may decide to use this variant in the other cases as well - if it can.



            E.g. some compilers internally support variable-sized arrays, so even while the language requires compile-time array bounds, the implementation may decide not to.






            share|improve this answer
























            • Shouldn't case 2 lead to a compilation error instead? The constexpr indicates that the expression must be evaluable at compile time.

              – fishinear
              32 mins ago











            • @fishinear No. The answer is referring to a the uses of a constexpr function. E.g. if I have constexpr int factorial(int n), and I have an int input I only know at runtime, int output = factorial(input); is perfectly fine. The error would be claiming constexpr int output = factorial(input);, because input is not constexpr, so neither can output be constexpr.

              – HTNW
              3 mins ago


















            9














            StoryTeller's answer is good, but I think there's a slightly different take possible.



            With constexpr, there are three situations to distinguish:




            1. The result is needed in a compile-time context, such as array sizes. In this case, the arguments too must be known at compile time. Evaluation is probably at compile time, and at least all diagnosable errors will be found at compile time.


            2. The arguments are only known at run time, and the result is not needed at compile time. In this case, evaluation necessarily has to happen at run time.


            3. The arguments may be available at compile time, but the result is needed only at run time.



            The fourth combination (arguments available only at runtime, result needed at compile time) is an error; the compiler will reject such code.



            Now in cases 1 and 3 the calculation could happen at compile time, as all inputs are available. But to facilitate case 2, the compiler must be able to create a run-time version, and it may decide to use this variant in the other cases as well - if it can.



            E.g. some compilers internally support variable-sized arrays, so even while the language requires compile-time array bounds, the implementation may decide not to.






            share|improve this answer
























            • Shouldn't case 2 lead to a compilation error instead? The constexpr indicates that the expression must be evaluable at compile time.

              – fishinear
              32 mins ago











            • @fishinear No. The answer is referring to a the uses of a constexpr function. E.g. if I have constexpr int factorial(int n), and I have an int input I only know at runtime, int output = factorial(input); is perfectly fine. The error would be claiming constexpr int output = factorial(input);, because input is not constexpr, so neither can output be constexpr.

              – HTNW
              3 mins ago
















            9












            9








            9







            StoryTeller's answer is good, but I think there's a slightly different take possible.



            With constexpr, there are three situations to distinguish:




            1. The result is needed in a compile-time context, such as array sizes. In this case, the arguments too must be known at compile time. Evaluation is probably at compile time, and at least all diagnosable errors will be found at compile time.


            2. The arguments are only known at run time, and the result is not needed at compile time. In this case, evaluation necessarily has to happen at run time.


            3. The arguments may be available at compile time, but the result is needed only at run time.



            The fourth combination (arguments available only at runtime, result needed at compile time) is an error; the compiler will reject such code.



            Now in cases 1 and 3 the calculation could happen at compile time, as all inputs are available. But to facilitate case 2, the compiler must be able to create a run-time version, and it may decide to use this variant in the other cases as well - if it can.



            E.g. some compilers internally support variable-sized arrays, so even while the language requires compile-time array bounds, the implementation may decide not to.






            share|improve this answer













            StoryTeller's answer is good, but I think there's a slightly different take possible.



            With constexpr, there are three situations to distinguish:




            1. The result is needed in a compile-time context, such as array sizes. In this case, the arguments too must be known at compile time. Evaluation is probably at compile time, and at least all diagnosable errors will be found at compile time.


            2. The arguments are only known at run time, and the result is not needed at compile time. In this case, evaluation necessarily has to happen at run time.


            3. The arguments may be available at compile time, but the result is needed only at run time.



            The fourth combination (arguments available only at runtime, result needed at compile time) is an error; the compiler will reject such code.



            Now in cases 1 and 3 the calculation could happen at compile time, as all inputs are available. But to facilitate case 2, the compiler must be able to create a run-time version, and it may decide to use this variant in the other cases as well - if it can.



            E.g. some compilers internally support variable-sized arrays, so even while the language requires compile-time array bounds, the implementation may decide not to.







            share|improve this answer












            share|improve this answer



            share|improve this answer










            answered 4 hours ago









            MSaltersMSalters

            133k8116267




            133k8116267













            • Shouldn't case 2 lead to a compilation error instead? The constexpr indicates that the expression must be evaluable at compile time.

              – fishinear
              32 mins ago











            • @fishinear No. The answer is referring to a the uses of a constexpr function. E.g. if I have constexpr int factorial(int n), and I have an int input I only know at runtime, int output = factorial(input); is perfectly fine. The error would be claiming constexpr int output = factorial(input);, because input is not constexpr, so neither can output be constexpr.

              – HTNW
              3 mins ago





















            • Shouldn't case 2 lead to a compilation error instead? The constexpr indicates that the expression must be evaluable at compile time.

              – fishinear
              32 mins ago











            • @fishinear No. The answer is referring to a the uses of a constexpr function. E.g. if I have constexpr int factorial(int n), and I have an int input I only know at runtime, int output = factorial(input); is perfectly fine. The error would be claiming constexpr int output = factorial(input);, because input is not constexpr, so neither can output be constexpr.

              – HTNW
              3 mins ago



















            Shouldn't case 2 lead to a compilation error instead? The constexpr indicates that the expression must be evaluable at compile time.

            – fishinear
            32 mins ago





            Shouldn't case 2 lead to a compilation error instead? The constexpr indicates that the expression must be evaluable at compile time.

            – fishinear
            32 mins ago













            @fishinear No. The answer is referring to a the uses of a constexpr function. E.g. if I have constexpr int factorial(int n), and I have an int input I only know at runtime, int output = factorial(input); is perfectly fine. The error would be claiming constexpr int output = factorial(input);, because input is not constexpr, so neither can output be constexpr.

            – HTNW
            3 mins ago







            @fishinear No. The answer is referring to a the uses of a constexpr function. E.g. if I have constexpr int factorial(int n), and I have an int input I only know at runtime, int output = factorial(input); is perfectly fine. The error would be claiming constexpr int output = factorial(input);, because input is not constexpr, so neither can output be constexpr.

            – HTNW
            3 mins ago




















            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54181797%2fc-constexpr-function-in-return-statement%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Floris Gerts

            Gregoriusmis

            Goes