Why is Visual Studio 2013 having trouble with this class member decltype?

匿名 (未验证) 提交于 2019-12-03 02:16:02

问题:

#include <vector>  struct C {     std::vector<int> v;     decltype(v.begin()) begin() { return v.begin(); }     decltype(v.end()) end() { return v.end(); } }; 

Clang++ has no problem, but MSVC 2013 gives the following error:

error C2228: left of '.begin' must have class/struct/union 

回答1:

This is a known bug in VS2013, fixed in VS2015. The compiler will accept the code if you use a trailing return type instead.

struct C {     std::vector<int> v;     auto begin() -> decltype(v.begin()) { return v.begin(); }     auto end()   -> decltype(v.end())   { return v.end(); } }; 

As the bug report says, another work around is by using:

struct C {     std::vector<int> v;     decltype(std::declval<decltype(v)>().begin()) begin() { return v.begin(); }     decltype(std::declval<decltype(v)>().end())   end()   { return v.end(); } }; 

But as @BenVoigt points out in the comments, read this answer for why the trailing return type should be the preferred option.


Search the linked page for C++ decltype of class-member access incompletely implemented



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