问题标签 [trailing-return-type]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
2845 浏览

c++ - 尾随返回类型、decltype 和 const-ness

我只是在尝试新的尾随返回类型,但我遇到了这个(简化的)代码的问题

忽略这段代码毫无意义的事实。重要的部分是使用 GCC 4.6.1(带-std=c++0x标志)时产生的编译器错误:

如果您不喜欢涉及模板的错误,短篇小说是在const版本的主体中MyContainer::begin,表达式ints.begin()返回一个类型的值std::list<int>::const_iterator(因为intsconst这样的上下文中)。但是,decltype(ints.begin())产生 type std::list<int>::iterator,即在决定表达式的类型时decltype 忽略方法的const限定符。begin不出所料,结果是类型冲突。

在我看来,这似乎是 GCC 编译器中的一个错误。decltype只有尊重const限定符并产生const_iterator类型才有意义。任何人都可以确认或否认(甚至可能解释)这一点吗?也许我忽略了 的机制中的某些内容decltype,但这看起来是一个非常简单的场景。

注意:据我所知,相同的行为不仅适用于,而且适用于任何具有在-ness 上std::list<int>重载的返回不兼容类型的成员函数的类型。const

0 投票
3 回答
2173 浏览

c++ - 在成员函数尾随返回类型中使用 this 和属性?

在我给出的这个答案中,使用尾随返回类型中this的类的属性作为表达式的一部分是有意义的。可以不用,但不方便。_argdecltype

但是,clang 3.0(见下文)和gcc 4.5.2都没有接受它。

铿锵 3.0 说:

嗯……不太好。

但是,在大多数编译器中,对 C++11 的支持充其量只是 hacky,我找不到标准 (n3290) 中提到的具体限制。

在评论中,Xeo 暗示这可能是标准中的一个缺陷......

那么,这是否允许?

奖励:最新版本的 clang / gcc 支持这个吗?

0 投票
4 回答
31132 浏览

c++ - 尾随返回类型语法样式是否应该成为新 C++11 程序的默认值?

C++11 支持一种新的函数语法:

目前这个函数将被声明为:

新风格似乎还没有被广泛采用(比如在 gcc stl 中)

然而,这种新风格应该在新的 C++11 程序中无处不在,还是只在需要时使用?

就个人而言,如果可能的话,我更喜欢旧风格,但是混合风格的代码库看起来很丑。

0 投票
2 回答
1980 浏览

c++ - 可以使用尾随返回类型进行条件重载吗?

假设您尝试执行以下操作:

是否可以将条件包含/重载(std::enable_if)与尾随返回类型(auto ... -> decltype())结合起来?

我不会对使用预处理器的解决方案感兴趣。我总是可以做类似的事情

并将其扩展为也采用整个条件。相反,我感兴趣的是语言是否支持它而不使用返回类型的另一个特征,即ReturnType<A,B>::type_t或函数体中使用的任何特征。

0 投票
3 回答
1360 浏览

c++ - 成员函数声明签名中的类成员可见性

为什么会这样:

但这不会(a并且f交换了位置):

a没有在该范围内(在 decltype 内)声明,但添加显式this->使其工作。

0 投票
1 回答
3400 浏览

c++ - 'auto f(params) -> decltype(..., void())' 中的 'void()' 有什么作用?

我在这里找到了看起来像这样的代码:

在我阅读的所有文档中,我被告知decltype签名为:

decltype( entity )

或者

decltype( expression )

并且在任何地方都没有第二个论点。至少这是cppreference所指出的。这是第二个论点decltype吗?如果是这样,它有什么作用?

0 投票
1 回答
300 浏览

c++ - 'auto a_class::f(...) -> T const' 在语法中是否模棱两可?

下面的成员函数原型应该如何在 C++11 中解释?

在我看来,它既可以是 C 类的 const 成员函数,也可以是返回 T 类型的 const 值的非 const 成员函数。

我知道我可以把函数写成

或者

但是,我想与我声明函数的方式保持一致,所以我决定auto f(...) -> RetType到处使用新的 C++11 方式。

0 投票
1 回答
391 浏览

c++ - 如何正确编写尾随返回类型?

假设我有这个函数模板:

当然,这个函数需要一个尾随返回类型,考虑到函数的目的,我真的做错了。

这个函数应该做的是使用,对一个对象arg进行一些操作,并将该操作的结果用作函数的返回值。显然,的返回类型必须(兼容地)与为和对象完成的操作的返回类型匹配。argT2DoSomething()argT2

再次假设我们DoSomething()做一些真正的操作,比如乘法。然后我们将编写DoSomething()如下代码:

然后我应该如何为此形成尾随返回类型?


PS:我已经尝试使用decltype(arg * T2),decltype(T1 * T2)decltype(T1::operator * (T2))其他一些看起来很奇怪decltype的尾随返回类型。他们都没有工作。

0 投票
3 回答
466 浏览

c++ - 为什么不编译尾随返回类型中的此运算符用法?

我试图在另一个函数的尾随返回类型中重用运算符的返回类型,但不幸的是,clang 不接受它

Clang 说我的班级没有 operator[]。Gcc 确实接受了我的代码。我的代码实际上无效吗?

0 投票
2 回答
1323 浏览

c++ - 使用多语句 lambda 的返回类型推导

我一直在编写代码,最近发现 g++ 不会警告我某类问题:根据 C++11 5.1.2.4,如果您的 lambda 不是单个返回语句,则返回类型必须声明为尾随返回类型或无效。

尽管如果 g++ 足够有意义,则允许编译无效代码,但有没有办法关闭此行为(-fpedantic在 g++-4.7 中允许)或至少对此发出警告?

示例代码:

C++11 5.1.2.4

实现不应将右值引用类型的成员添加到闭包类型。如果 lambda-expression 不包含 lambda-declarator,就好像 lambda-declarator 是 ()。如果 lambda 表达式不包含 trailing-return-type,就好像 trailing-return-type 表示以下类型:

— 如果复合语句的形式为
{ attribute-specifier-seq(opt) return expression ;
左值到右值转换(4.1)、数组到指针转换(4.2)和函数到指针转换(4.3)后返回表达式的类型;

——否则,无效。