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

Time travel from stationary position?

Are ETF trackers fundamentally better than individual stocks?

Recruiter wants very extensive technical details about all of my previous work

What are substitutions for coconut in curry?

Do the common programs (for example: "ls", "cat") in Linux and BSD come from the same source code?

My adviser wants to be the first author

Python if-else code style for reduced code

newcommand: Combine (optional) star and optional parameter

Pólya urn flip and roll

How to deal with taxi scam when on vacation?

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

How to create the Curved texte?

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

Could the Saturn V actually have launched astronauts around Venus?

Are all passive ability checks floors for active ability checks?

AG Cluster db upgrade by vendor

How could a scammer know the apps on my phone / iTunes account?

Are there verbs that are neither telic, or atelic?

What approach do we need to follow for projects without a test environment?

Happy pi day, everyone!

Gravity magic - How does it work?

Is a party consisting of only a bard, a cleric, and a warlock functional long-term?

Does Mathematica reuse previous computations?

What's causing this power spike in STM32 low power mode



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










16















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
    4 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
    3 hours ago












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

    – burnpanck
    3 hours ago















16















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
    4 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
    3 hours ago












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

    – burnpanck
    3 hours ago













16












16








16


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 4 hours ago









Barry

184k21323594




184k21323594










asked 4 hours ago









burnpanckburnpanck

1,131622




1,131622







  • 5





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

    – NathanOliver
    4 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
    3 hours ago












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

    – burnpanck
    3 hours ago












  • 5





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

    – NathanOliver
    4 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
    3 hours ago












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

    – burnpanck
    3 hours ago







5




5





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

– NathanOliver
4 hours ago





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

– NathanOliver
4 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
3 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
3 hours ago














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

– burnpanck
3 hours ago





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

– burnpanck
3 hours ago












1 Answer
1






active

oldest

votes


















9














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









    9














    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



























      9














      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

























        9












        9








        9







        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 3 hours ago









        BarryBarry

        184k21323594




        184k21323594





























            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

            Which organization defines CJK Unified Ideographs? The Next CEO of Stack OverflowCharacters which have several different shapesHow useful are the kanji in reading Chinese?Can Chinese readers scan large amounts of text faster/more accurately than their alphabet-using counterparts?丼: why is “well” also “bowl of food”?What Does Unicode 8.0 Mean For Chinese?How are blanks indicated for placeholders in Chinese (like ???)Is there a dictionary of standard character variants?How to display CJK Extension F?How is it decided as to which character is used on the tech terminology?How does 子 come to mean 'midnight'?

            Was it really necessary for the Lunar Module to have 2 stages?Did the Apollo lunar module descent stage have a role as a sort of service module?How was reserve fuel calculated for the Apollo missions?Could the Apollo LM abort mode be engaged after touchdown? What would have happened if it was?Is true that Armstrong was not designated as first to walk on the moon?Where is the first Lunar soil sample currently located?Could a single crew member fly the Apollo LM?How much mass could the Saturn V rockets have landed on the Moon if nothing was coming back?What was the Apollo service module propellant used for on the LEO missions?Could the Apollo LM abort mode be engaged after touchdown? What would have happened if it was?Did the combined Command and Service Module and Lunar Module perform another 180° turn after transposition, docking and extraction?How did the Lunar Module dock with the rest of Apollo 11 and what is the “CSM”?Was there a technical reason why Apollo 10 didn't land on the moon?How long is the Apollo Lunar Module extraction window?

            Shenzhen Football Club Índice Elenco atual | Títulos | Referências Ligações externas | Menu de navegaçãoGooglenotíciaslivrosacadêmicoeditar«"Elenco"»Site oficialexpandindo-oeee