为什么 Visual Studio 2013 遇到此类成员 decltype 的问题?

Why is Visual Studio 2013 having trouble with this class member decltype?(为什么 Visual Studio 2013 遇到此类成员 decltype 的问题?)

本文介绍了为什么 Visual Studio 2013 遇到此类成员 decltype 的问题?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

#include <vector>

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

Clang++没有问题,但是MSVC 2013报错如下:

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

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

推荐答案

这是 VS2013 中的已知错误,已修复 在 VS2015 中.如果您改用尾随返回类型,编译器将接受该代码.

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(); }
};

但正如@BenVoigt 在评论中指出的那样,阅读这个答案 了解为什么尾随返回类型应该是首选选项.

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

在链接页面中搜索未完全实现的类成员访问的C++ decltype

这篇关于为什么 Visual Studio 2013 遇到此类成员 decltype 的问题?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本文标题为:为什么 Visual Studio 2013 遇到此类成员 decltype 的问题?