May I change the held type in a std::variant from within a call to std::visit2019 Community Moderator ElectionImplementing is_constexpr_copiableHow does std::visit work with std::variant?Visit and invoke a variant of std::functionVisit a variant with a monostateHow to simplify std::variant class typesis decltype required in trailing return using value of argument typeget currently held typeid of std::variant (like boost::variant type())noexcept visitation for std::variantHow to use std::visit with std::variant containing enumPredefined type list passed to a std::variant

PTIJ: Who should I vote for? (21st Knesset Edition)

how to write formula in word in latex

How can I track script which gives me "command not found" right after the login?

Does someone need to be connected to my network to sniff HTTP requests?

How to write cleanly even if my character uses expletive language?

Is it true that good novels will automatically sell themselves on Amazon (and so on) and there is no need for one to waste time promoting?

How to change two letters closest to a string and one letter immediately after a string using notepad++

How Could an Airship Be Repaired Mid-Flight

Look at your watch and tell me what time is it. vs Look at your watch and tell me what time it is

Why do passenger jet manufacturers design their planes with stall prevention systems?

Employee lack of ownership

If the DM rolls initiative once for a group of monsters, how do end-of-turn effects work?

Why Choose Less Effective Armour Types?

Should we release the security issues we found in our product as CVE or we can just update those on weekly release notes?

How to read the value of this capacitor?

How do I hide Chekhov's Gun?

Bach's Toccata and Fugue in D minor breaks the "no parallel octaves" rule?

Creature kill and resurrect effects on the stack interaction?

SOQL: Populate a Literal List in WHERE IN Clause

Interplanetary conflict, some disease destroys the ability to understand or appreciate music

Why did it take so long to abandon sail after steamships were demonstrated?

How to use deus ex machina safely?

Is this a real picture of Jordan Peterson in New Zealand with a fan wearing a shirt that says "I'm a Proud Islamaphobe"?

If I can solve Sudoku can I solve Travelling Salesman Problem(TSP)? If yes, how?



May I change the held type in a std::variant from within a call to std::visit



2019 Community Moderator ElectionImplementing is_constexpr_copiableHow does std::visit work with std::variant?Visit and invoke a variant of std::functionVisit a variant with a monostateHow to simplify std::variant class typesis decltype required in trailing return using value of argument typeget currently held typeid of std::variant (like boost::variant type())noexcept visitation for std::variantHow to use std::visit with std::variant containing enumPredefined type list passed to a std::variant










18















Does the following code invoke undefined behaviour?



std::variant<A,B> v = ...;

std::visit([&v](auto& e)
if constexpr (std::is_same_v<std::remove_reference_t<decltype(e)>,A>)
e.some_modifying_operation_on_A();
else
int i = e.some_accessor_of_B();
v = some_function_returning_A(i);

, v);


In particular, when the variant does not contain an A,
this code re-assigns an A while still holding a reference to the previously held object of type B.
However, because the reference is not used anymore after the assignment,
I feel the code is fine.
However, would a standard-library be free to implement std::visit
in a way such that the above is undefined behaviour?










share|improve this question



















  • 5





    Do you want quotes from the standard to back up the answer(s) you get?

    – NathanOliver
    12 hours ago






  • 1





    From looking at [variant.visit], I'm 99% sure this code is compliant and guaranteed not to have UB, since std::visit(vis, variant) should be equivalent to vis(get</* active member */>(variant)), but I'm not confident enough in reading the standard to be certain

    – Justin
    12 hours ago












  • @NathanOliver: I don't need actual quotes from the standard, as long as the experts here can agree on the answer:-).

    – burnpanck
    12 hours ago















18















Does the following code invoke undefined behaviour?



std::variant<A,B> v = ...;

std::visit([&v](auto& e)
if constexpr (std::is_same_v<std::remove_reference_t<decltype(e)>,A>)
e.some_modifying_operation_on_A();
else
int i = e.some_accessor_of_B();
v = some_function_returning_A(i);

, v);


In particular, when the variant does not contain an A,
this code re-assigns an A while still holding a reference to the previously held object of type B.
However, because the reference is not used anymore after the assignment,
I feel the code is fine.
However, would a standard-library be free to implement std::visit
in a way such that the above is undefined behaviour?










share|improve this question



















  • 5





    Do you want quotes from the standard to back up the answer(s) you get?

    – NathanOliver
    12 hours ago






  • 1





    From looking at [variant.visit], I'm 99% sure this code is compliant and guaranteed not to have UB, since std::visit(vis, variant) should be equivalent to vis(get</* active member */>(variant)), but I'm not confident enough in reading the standard to be certain

    – Justin
    12 hours ago












  • @NathanOliver: I don't need actual quotes from the standard, as long as the experts here can agree on the answer:-).

    – burnpanck
    12 hours ago













18












18








18


2






Does the following code invoke undefined behaviour?



std::variant<A,B> v = ...;

std::visit([&v](auto& e)
if constexpr (std::is_same_v<std::remove_reference_t<decltype(e)>,A>)
e.some_modifying_operation_on_A();
else
int i = e.some_accessor_of_B();
v = some_function_returning_A(i);

, v);


In particular, when the variant does not contain an A,
this code re-assigns an A while still holding a reference to the previously held object of type B.
However, because the reference is not used anymore after the assignment,
I feel the code is fine.
However, would a standard-library be free to implement std::visit
in a way such that the above is undefined behaviour?










share|improve this question
















Does the following code invoke undefined behaviour?



std::variant<A,B> v = ...;

std::visit([&v](auto& e)
if constexpr (std::is_same_v<std::remove_reference_t<decltype(e)>,A>)
e.some_modifying_operation_on_A();
else
int i = e.some_accessor_of_B();
v = some_function_returning_A(i);

, v);


In particular, when the variant does not contain an A,
this code re-assigns an A while still holding a reference to the previously held object of type B.
However, because the reference is not used anymore after the assignment,
I feel the code is fine.
However, would a standard-library be free to implement std::visit
in a way such that the above is undefined behaviour?







c++ c++17 std-variant






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 12 hours ago









Barry

184k21324595




184k21324595










asked 13 hours ago









burnpanckburnpanck

1,141622




1,141622







  • 5





    Do you want quotes from the standard to back up the answer(s) you get?

    – NathanOliver
    12 hours ago






  • 1





    From looking at [variant.visit], I'm 99% sure this code is compliant and guaranteed not to have UB, since std::visit(vis, variant) should be equivalent to vis(get</* active member */>(variant)), but I'm not confident enough in reading the standard to be certain

    – Justin
    12 hours ago












  • @NathanOliver: I don't need actual quotes from the standard, as long as the experts here can agree on the answer:-).

    – burnpanck
    12 hours ago












  • 5





    Do you want quotes from the standard to back up the answer(s) you get?

    – NathanOliver
    12 hours ago






  • 1





    From looking at [variant.visit], I'm 99% sure this code is compliant and guaranteed not to have UB, since std::visit(vis, variant) should be equivalent to vis(get</* active member */>(variant)), but I'm not confident enough in reading the standard to be certain

    – Justin
    12 hours ago












  • @NathanOliver: I don't need actual quotes from the standard, as long as the experts here can agree on the answer:-).

    – burnpanck
    12 hours ago







5




5





Do you want quotes from the standard to back up the answer(s) you get?

– NathanOliver
12 hours ago





Do you want quotes from the standard to back up the answer(s) you get?

– NathanOliver
12 hours ago




1




1





From looking at [variant.visit], I'm 99% sure this code is compliant and guaranteed not to have UB, since std::visit(vis, variant) should be equivalent to vis(get</* active member */>(variant)), but I'm not confident enough in reading the standard to be certain

– Justin
12 hours ago






From looking at [variant.visit], I'm 99% sure this code is compliant and guaranteed not to have UB, since std::visit(vis, variant) should be equivalent to vis(get</* active member */>(variant)), but I'm not confident enough in reading the standard to be certain

– Justin
12 hours ago














@NathanOliver: I don't need actual quotes from the standard, as long as the experts here can agree on the answer:-).

– burnpanck
12 hours ago





@NathanOliver: I don't need actual quotes from the standard, as long as the experts here can agree on the answer:-).

– burnpanck
12 hours ago












1 Answer
1






active

oldest

votes


















11














The code is fine.



There is no requirement in the specification of std::visit that the visitor not change the alternative of any of the variants it is invoked on. The only requirement is:




Requires: For each valid pack m, e(m) shall be a valid expression. All such expressions shall be of the same type and value category; otherwise, the program is ill-formed.




Your visitor is a valid expression for each m and always returns void, so it satisfies the requirements and has well-defined behavior.






share|improve this answer






















    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%2f55187548%2fmay-i-change-the-held-type-in-a-stdvariant-from-within-a-call-to-stdvisit%23new-answer', 'question_page');

    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    11














    The code is fine.



    There is no requirement in the specification of std::visit that the visitor not change the alternative of any of the variants it is invoked on. The only requirement is:




    Requires: For each valid pack m, e(m) shall be a valid expression. All such expressions shall be of the same type and value category; otherwise, the program is ill-formed.




    Your visitor is a valid expression for each m and always returns void, so it satisfies the requirements and has well-defined behavior.






    share|improve this answer



























      11














      The code is fine.



      There is no requirement in the specification of std::visit that the visitor not change the alternative of any of the variants it is invoked on. The only requirement is:




      Requires: For each valid pack m, e(m) shall be a valid expression. All such expressions shall be of the same type and value category; otherwise, the program is ill-formed.




      Your visitor is a valid expression for each m and always returns void, so it satisfies the requirements and has well-defined behavior.






      share|improve this answer

























        11












        11








        11







        The code is fine.



        There is no requirement in the specification of std::visit that the visitor not change the alternative of any of the variants it is invoked on. The only requirement is:




        Requires: For each valid pack m, e(m) shall be a valid expression. All such expressions shall be of the same type and value category; otherwise, the program is ill-formed.




        Your visitor is a valid expression for each m and always returns void, so it satisfies the requirements and has well-defined behavior.






        share|improve this answer













        The code is fine.



        There is no requirement in the specification of std::visit that the visitor not change the alternative of any of the variants it is invoked on. The only requirement is:




        Requires: For each valid pack m, e(m) shall be a valid expression. All such expressions shall be of the same type and value category; otherwise, the program is ill-formed.




        Your visitor is a valid expression for each m and always returns void, so it satisfies the requirements and has well-defined behavior.







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered 12 hours ago









        BarryBarry

        184k21324595




        184k21324595





























            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%2f55187548%2fmay-i-change-the-held-type-in-a-stdvariant-from-within-a-call-to-stdvisit%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

            How should I use the fbox command correctly to avoid producing a Bad Box message?How to put a long piece of text in a box?How to specify height and width of fboxIs there an arrayrulecolor-like command to change the rule color of fbox?What is the command to highlight bad boxes in pdf?Why does fbox sometimes place the box *over* the graphic image?how to put the text in the boxHow to create command for a box where text inside the box can automatically adjust?how can I make an fbox like command with certain color, shape and width of border?how to use fbox in align modeFbox increase the spacing between the box and it content (inner margin)how to change the box height of an equationWhat is the use of the hbox in a newcommand command?

            152 Atala Notae | Nexus externi | Tabula navigationis"Discovery Circumstances: Numbered Minor Planets"2000152Small-Body Database

            Doxepinum Nexus interni Notae | Tabula navigationis3158DB01142WHOa682390"Structural Analysis of the Histamine H1 Receptor""Transdermal and Topical Drug Administration in the Treatment of Pain""Antidepressants as antipruritic agents: A review"