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'?

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

            When We Were Young (canção de Adele) Índice Antecedentes e lançamento | Faixas e formatos | Performances e covers | Desempenho nas tabelas musicais | Créditos | Histórico de lançamento | Referências Menu de navegação«Best albums of 2015»«Adele - When We Were Young (Radio Date: 22-01-2016)»«When We Were Young - Single by Adele»«Adele: Inside Her Private Life and Triumphant Return»«adele interview: world exclusive first interview in three years»«Tobias Jesso Jr: since Adele tweeted his song, he's even bigger than his dad»«Adele interviews Tobias Jesso Jr: 'I think that a couple of the ideas we had could be rap songs'»«Adele on Her Return: 'I Was So Frightened That No One Cared'»«Tobias Jesso Jr. on working with Adele: 'I was as nervous as shit'»«How Ariel Rechtshaid Pushed Adele To Her Limit»«Adele Previews 'When We Were Young' on '60 Minutes' Teaser, Tops Trending 140»«Adele Performs New '25' Ballad, "When We Were Young" Live: Watch»«Which '25' Song Should Be Adele's Next Single?»«Adele's 'When We Were Young' Confirmed As Second Single From '25'»«Adele's new single artwork for 'When We Were Young' is perfectly adorable»«Adele at the BBC review: honest, funny and spectacular – Celebrity News News»«'Saturday Night Live': Adele Sings 'Hello' and 'When We Were Young'»«'Adele: Live in New York City' NBC Special – Set List Revealed!»«Adele Closes Out the 2016 Brit Awards With 'When We Were Young'»«What Is The Adele Live Tour Set List? There's No Way She'd Leave Out These 8 Songs»«See Demi Lovato's Soaring Cover of Adele's 'When We Were Young'»«'The Voice': 5 Best Moments From Week 1 Blind Auditions»«Adele – When We Were Young (Media Control Charts)»«Adele – When We Were Young (Entertainment Monitoring Africa)»«Adele – When We Were Young (ARIA Charts)»«Adele – When We Were Young (Ö3 Austria Top 40)»«Adele – When We Were Young (Ultratop 50)»«Adele – When We Were Young (Ultratop 40)»«Adele – When We Were Young (Canadian Hot 100)»«Adele – When We Were Young (Tracklisten)»«Adele – When We Were Young (The Official Charts Company)»«Adele – Hello (IFPI Slovenská Republika)»«Adele – When We Were Young (Productores de Música de España)»«Adele – When We Were Young (Billboard Hot 100)»«Adele – When We Were Young (Pop Songs)»«Adele – When We Were Young (Adult Pop Songs)»«Adele – When We Were Young (Hot Adult Contemporary Charts)»«Adele – When We Were Young (Hot Dance Club Songs)»«Adele – When We Were Young (Rock Airplay)»«Adele – When We Were Young (IFPI Finlândia)»«Adele – When We Were Young (Syndicat National de l'Éditon Phonographique)»«Adele – When We Were Young (Magyar Hanglemezkiadók Szövetsége)»«Adele – When We Were Young (Irish Recorded Music Association)»«Adele – When We Were Young (Mexico Airplay)»«Adele – When We Were Young (VG-lista)»«Adele – When We Were Young (NZ Top 40 Singles)»«Adele – When We Were Young (MegaCharts)»«Adele – When We Were Young (Związek Producentów Audio Video)»«Adele – When We Were Young (Portugal Digital Songs)»«Adele – When We Were Young (UK Indie Singles Chart)»«Adele – When We Were Young (UK Singles Chart)»«Adele – When We Were Young (Sverigetopplistan)»«Adele – When We Were Young (Schweizer Hitparade)»«Adele – When We Were Young (Portugal Digital Songs)»«Music Canada – Gold/Platinum – When We Were Young»«NZ Top 40 Singles Chart»«Certified Awards»e