Initializing reference member variable with literal

走远了吗. 提交于 2020-01-24 08:41:25

问题


In the following code , I am initializing a reference variable with a literal.

class ABC
{
  public:
     const int& a;
     ABC():a(43) { }
     void newfoo()
     {
           printf("NEWFOO %d",a);
     }
};
int main()
{
   ABC obj;
   obj.newfoo();
}

The output of this program is NEWFOO 32767 which seems illogical when I know that the following code works just fine.

int main()
{ 
  const int& b=3;
  printf("%d",b);
}

What is happening here ? If compiler declares some temp variable during initializing of the reference variable , then isn't the scope of that variable will be inside main since the class is in global scope ?


回答1:


Well clang produces the following warning for this code even without any flags (see it live):

warning: binding reference member 'a' to a temporary value [-Wdangling-field]
 ABC():a(43) { }
         ^~

gcc on the other hand requires either -Wall or -Wextra.

and if we check out this reference initialization reference it says:

a temporary bound to a reference member in a constructor initializer list persists only until the constructor exits, not as long as the object exists.

This can be found in the draft C++ standard section 12.2 Temporary objects paragraph 5 which includes the following bullet

— A temporary bound to a reference member in a constructor’s ctor-initializer (12.6.2) persists until the constructor exits.




回答2:


A temporary will be created and the reference is bound to that temporary (C++03 8.5.3.5). The temporary will be destroyed at the end of the constructor call, leaving a dangling reference. This is specified in C++03 12.2.5:

A temporary bound to a reference member in a constructor's ctor-initializer (12.6.2) persists until the constructor exits.



来源:https://stackoverflow.com/questions/21481481/initializing-reference-member-variable-with-literal

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!