Reference with supertype lifetime can't be used for subtype lifetime












1















I'm struggling to understand how subtyping of lifetimes works. The name subtype suggests to me that if 'b is a subtype of 'a, then things of type 'a can be used anywhere something of type 'b will be used. And practically, in the context of lifetimes, I don't see what could go wrong from allowing that. However, the following code



fn test<'a, 'b: 'a>(first: &'a mut str, second: &'b mut str) -> &'b str {
// do something to choose between the two arguments,
// eventually pick first on some branch
first
}


doesn't work, because "these two types are declared with different lifetimes... but data from first flows into second here."



So what would go wrong if this was allowed?










share|improve this question





























    1















    I'm struggling to understand how subtyping of lifetimes works. The name subtype suggests to me that if 'b is a subtype of 'a, then things of type 'a can be used anywhere something of type 'b will be used. And practically, in the context of lifetimes, I don't see what could go wrong from allowing that. However, the following code



    fn test<'a, 'b: 'a>(first: &'a mut str, second: &'b mut str) -> &'b str {
    // do something to choose between the two arguments,
    // eventually pick first on some branch
    first
    }


    doesn't work, because "these two types are declared with different lifetimes... but data from first flows into second here."



    So what would go wrong if this was allowed?










    share|improve this question



























      1












      1








      1








      I'm struggling to understand how subtyping of lifetimes works. The name subtype suggests to me that if 'b is a subtype of 'a, then things of type 'a can be used anywhere something of type 'b will be used. And practically, in the context of lifetimes, I don't see what could go wrong from allowing that. However, the following code



      fn test<'a, 'b: 'a>(first: &'a mut str, second: &'b mut str) -> &'b str {
      // do something to choose between the two arguments,
      // eventually pick first on some branch
      first
      }


      doesn't work, because "these two types are declared with different lifetimes... but data from first flows into second here."



      So what would go wrong if this was allowed?










      share|improve this question
















      I'm struggling to understand how subtyping of lifetimes works. The name subtype suggests to me that if 'b is a subtype of 'a, then things of type 'a can be used anywhere something of type 'b will be used. And practically, in the context of lifetimes, I don't see what could go wrong from allowing that. However, the following code



      fn test<'a, 'b: 'a>(first: &'a mut str, second: &'b mut str) -> &'b str {
      // do something to choose between the two arguments,
      // eventually pick first on some branch
      first
      }


      doesn't work, because "these two types are declared with different lifetimes... but data from first flows into second here."



      So what would go wrong if this was allowed?







      rust






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Dec 29 '18 at 16:38









      E_net4 wishes happy holidays

      12.1k63568




      12.1k63568










      asked Dec 29 '18 at 16:09









      Ben PiousBen Pious

      3,85011626




      3,85011626
























          1 Answer
          1






          active

          oldest

          votes


















          1















          So what would go wrong if this was allowed?




          Your reasoning was inverted in this example: a constraint 'b: 'a reads as "'b lives as long as 'a". Since the output of test needs to live for at least as long as the lifetime 'b, 'a still represents a possibly incompatible lifetime, and first might actually not live long enough.



          If you flip the lifetimes around, the code will then compile.



          fn test<'a, 'b: 'a>(first: &'b mut str, second: &'a mut str) -> &'a str {
          first
          }





          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%2f53971157%2freference-with-supertype-lifetime-cant-be-used-for-subtype-lifetime%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









            1















            So what would go wrong if this was allowed?




            Your reasoning was inverted in this example: a constraint 'b: 'a reads as "'b lives as long as 'a". Since the output of test needs to live for at least as long as the lifetime 'b, 'a still represents a possibly incompatible lifetime, and first might actually not live long enough.



            If you flip the lifetimes around, the code will then compile.



            fn test<'a, 'b: 'a>(first: &'b mut str, second: &'a mut str) -> &'a str {
            first
            }





            share|improve this answer




























              1















              So what would go wrong if this was allowed?




              Your reasoning was inverted in this example: a constraint 'b: 'a reads as "'b lives as long as 'a". Since the output of test needs to live for at least as long as the lifetime 'b, 'a still represents a possibly incompatible lifetime, and first might actually not live long enough.



              If you flip the lifetimes around, the code will then compile.



              fn test<'a, 'b: 'a>(first: &'b mut str, second: &'a mut str) -> &'a str {
              first
              }





              share|improve this answer


























                1












                1








                1








                So what would go wrong if this was allowed?




                Your reasoning was inverted in this example: a constraint 'b: 'a reads as "'b lives as long as 'a". Since the output of test needs to live for at least as long as the lifetime 'b, 'a still represents a possibly incompatible lifetime, and first might actually not live long enough.



                If you flip the lifetimes around, the code will then compile.



                fn test<'a, 'b: 'a>(first: &'b mut str, second: &'a mut str) -> &'a str {
                first
                }





                share|improve this answer














                So what would go wrong if this was allowed?




                Your reasoning was inverted in this example: a constraint 'b: 'a reads as "'b lives as long as 'a". Since the output of test needs to live for at least as long as the lifetime 'b, 'a still represents a possibly incompatible lifetime, and first might actually not live long enough.



                If you flip the lifetimes around, the code will then compile.



                fn test<'a, 'b: 'a>(first: &'b mut str, second: &'a mut str) -> &'a str {
                first
                }






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Dec 29 '18 at 16:44









                E_net4 wishes happy holidaysE_net4 wishes happy holidays

                12.1k63568




                12.1k63568






























                    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%2f53971157%2freference-with-supertype-lifetime-cant-be-used-for-subtype-lifetime%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

                    Monofisismo

                    Angular Downloading a file using contenturl with Basic Authentication

                    Olmecas