问题标签 [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.
c++ - 尾随返回类型、decltype 和 const-ness
我只是在尝试新的尾随返回类型,但我遇到了这个(简化的)代码的问题
忽略这段代码毫无意义的事实。重要的部分是使用 GCC 4.6.1(带-std=c++0x
标志)时产生的编译器错误:
如果您不喜欢涉及模板的错误,短篇小说是在const
版本的主体中MyContainer::begin
,表达式ints.begin()
返回一个类型的值std::list<int>::const_iterator
(因为ints
在const
这样的上下文中)。但是,decltype(ints.begin())
产生 type std::list<int>::iterator
,即在决定表达式的类型时decltype
忽略方法的const
限定符。begin
不出所料,结果是类型冲突。
在我看来,这似乎是 GCC 编译器中的一个错误。decltype
只有尊重const
限定符并产生const_iterator
类型才有意义。任何人都可以确认或否认(甚至可能解释)这一点吗?也许我忽略了 的机制中的某些内容decltype
,但这看起来是一个非常简单的场景。
注意:据我所知,相同的行为不仅适用于,而且适用于任何具有在-ness 上std::list<int>
重载的返回不兼容类型的成员函数的类型。const
c++ - 尾随返回类型语法样式是否应该成为新 C++11 程序的默认值?
C++11 支持一种新的函数语法:
目前这个函数将被声明为:
新风格似乎还没有被广泛采用(比如在 gcc stl 中)
然而,这种新风格应该在新的 C++11 程序中无处不在,还是只在需要时使用?
就个人而言,如果可能的话,我更喜欢旧风格,但是混合风格的代码库看起来很丑。
c++ - 可以使用尾随返回类型进行条件重载吗?
假设您尝试执行以下操作:
是否可以将条件包含/重载(std::enable_if
)与尾随返回类型(auto ... -> decltype()
)结合起来?
我不会对使用预处理器的解决方案感兴趣。我总是可以做类似的事情
并将其扩展为也采用整个条件。相反,我感兴趣的是语言是否支持它而不使用返回类型的另一个特征,即ReturnType<A,B>::type_t
或函数体中使用的任何特征。
c++ - 成员函数声明签名中的类成员可见性
为什么会这样:
但这不会(a
并且f
交换了位置):
说a
没有在该范围内(在 decltype 内)声明,但添加显式this->
使其工作。
c++ - 'auto f(params) -> decltype(..., void())' 中的 'void()' 有什么作用?
我在这里找到了看起来像这样的代码:
在我阅读的所有文档中,我被告知decltype
签名为:
decltype( entity )
或者
decltype( expression )
并且在任何地方都没有第二个论点。至少这是cppreference所指出的。这是第二个论点decltype
吗?如果是这样,它有什么作用?
c++ - 'auto a_class::f(...) -> T const' 在语法中是否模棱两可?
下面的成员函数原型应该如何在 C++11 中解释?
在我看来,它既可以是 C 类的 const 成员函数,也可以是返回 T 类型的 const 值的非 const 成员函数。
我知道我可以把函数写成
或者
但是,我想与我声明函数的方式保持一致,所以我决定auto f(...) -> RetType
到处使用新的 C++11 方式。
c++ - 如何正确编写尾随返回类型?
假设我有这个函数模板:
当然,这个函数需要一个尾随返回类型,考虑到函数的目的,我真的做错了。
这个函数应该做的是使用,对一个对象arg
进行一些操作,并将该操作的结果用作函数的返回值。显然,的返回类型必须(兼容地)与为和对象完成的操作的返回类型匹配。arg
T2
DoSomething()
arg
T2
再次假设我们DoSomething()
做一些真正的操作,比如乘法。然后我们将编写DoSomething()
如下代码:
然后我应该如何为此形成尾随返回类型?
PS:我已经尝试使用decltype(arg * T2)
,decltype(T1 * T2)
和decltype(T1::operator * (T2))
其他一些看起来很奇怪decltype
的尾随返回类型。他们都没有工作。
c++ - 为什么不编译尾随返回类型中的此运算符用法?
我试图在另一个函数的尾随返回类型中重用运算符的返回类型,但不幸的是,clang 不接受它
Clang 说我的班级没有 operator[]。Gcc 确实接受了我的代码。我的代码实际上无效吗?
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)后返回表达式的类型;——否则,无效。