问题标签 [decltype]

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 投票
6 回答
8507 浏览

c++ - decltype 中的成员函数调用

以下代码:

编译失败,报错:

如果我将其更改为:

我得到另一个错误:

这些有什么问题?我正在使用 gcc 4.6

0 投票
3 回答
812 浏览

c++ - 无法命名的 C++ 类型

在阅读维基百科关于 decltype 的页面时,我对这个声明感到好奇,

它的 [decltype's] 主要预期用途是在泛型编程中,通常很难甚至不可能命名依赖于模板参数的类型。

虽然我可以理解该语句的困难部分,但有什么示例需要命名在 C++03 下无法命名的类型?

编辑:我的观点是,因为 C++ 中的所有内容都有类型声明。为什么会出现无法命名类型的情况?此外,特征类不是旨在产生类型信息吗?特质类可以替代decltype吗?

0 投票
5 回答
2561 浏览

c++ - decltype 在 gcc 4.3.2 中无法正常工作?

前 2 个 decltypes 有效。第三个导致编译器错误。这是这个 gcc 版本的问题吗?

0 投票
3 回答
549 浏览

c++ - 在仅在某些情况下使用 decltype 的模板中实例化函数定义

作为理解 C++0x 的练习,我正在尝试创建一个 C++ 类,该类包含一些模板化类型的指针:

在 Wrapper 类内部,我想公开 T 可能通过 Wrapper 类实现的任何重载运算符。包装器本身只是将函数调用转发给底层的 t 对象。

问题是我不希望 Wrapper 暴露 T 可能无法实现的运算符。例如,如果 T 没有实现 operator+,那么 Wrapper 也不应该公开 operator+。

对于operator+(以及任何二元操作),一切正常,因为operator 必然成为模板函数,因此仅在我们尝试调用时才被实例化,例如Wrapper::operator+。

但是,对于一元运算符(例如,++),没有明确的方法来保护运算符,以便在当且仅当 T 实现 operator++ 时对其进行实例化。比如这个类中operator++的幼稚实现

无法为不支持 operator++() 的 T 编译。

根据我对标准的理解,如果我们有以下使用 Wrapper 的代码

我们将实例化 Wrapper 和Wrapper::operator++()的声明,但不实例化它的定义,除非我们调用它(或显式实例化它)。通常这是可以的,因为 X::operator++ 的使用只出现在 Wrapper::operator++() 的定义中。但是,由于 decltype,我们在声明中使用了 X::operator++,以便类型检查器检查 X::operator++ 的存在并因此失败。

如果底层对象也支持operator++(),我们能否定义operator++()(以及通常使用decltype的任何此类转发函数)具有实例化的属性?或者考虑到模板实例化的语义以及 decltype,这不可能完成吗?

0 投票
1 回答
999 浏览

c++ - C++0x decltype 和范围解析运算符

使用诸如 Foo 之类的类:

我发现 GCC 4.5 会拒绝以下内容

如果我使用中间类型定义,它将起作用,例如:

但我更喜欢保持命名空间干净。我认为优先级可能是一个问题,所以我也尝试了括号,但没有运气。它是不可能的,还是有一段语法可以帮助我?

0 投票
3 回答
15857 浏览

c++ - 获取没有对象的成员函数的返回类型

我有许多无法修改的类。每个都有一个复制构造函数、至少一个其他构造函数和一个foo()返回某个值的函数。我想制作一个可以从这些类中派生的类模板,并且具有与返回类型相同类型的数据成员foo()(对不起,如果我有一些术语错误)。

换句话说,我想要一个类模板

footype的返回类型在哪里T::foo()

如果基类都有,比如说,一个默认构造函数,我可以做

(使用 GCC 中的 C++0x 功能),但是除了复制构造函数之外,这些类没有任何共同的特定构造函数。

GCC 也不允许decltype(this->foo()),尽管显然有可能将其添加到 C++0x 标准中-有人知道这有多大可能吗?

我觉得应该可以按照decltype(foo())or的方式做一些事情,decltype(T::foo())但那些似乎不起作用:GCC 给出了一个错误的形式cannot call member function 'int A::foo()' without object

当然,我可以有一个额外的模板参数footype,甚至是类型的非类参数T,但是有什么办法可以避免这种情况吗?

0 投票
3 回答
1562 浏览

c++ - 使用 decltype 作为尾随返回类型的正确方法

我经常看到这种形式的例子:

但我敢说这是更好更正确的方法:

为什么?首先,这个例子中的 decltype 只需要推导出返回类型,所以 (t + u) 是返回类型而不是 (std::forward(t) + std::forward(u)),两个 ver 生成的第二个代码是同样,第三个 decltype(u + t) 更直接,并且准确地表达了程序员的意图,而没有带出实现的“胆量”。

你对这个话题有什么看法?

0 投票
5 回答
8712 浏览

c++ - 使用 decltype/SFINAE 检测操作员支持

一篇(有点)过时的文章探讨了decltype与 SFINAE 一起使用来检测类型是否支持某些运算符的方法,例如==or <

下面是用于检测类是否支持<运算符的示例代码:

这输出true,因为当然std::string支持<运营商。但是,如果我尝试将它与支持该<运算符的类一起使用,则会出现编译器错误:

所以 SFINAE 不在这里工作。我在 GCC 4.4 和 GCC 4.6 上试过这个,都表现出相同的行为。那么,是否可以通过这种方式使用 SFINAE 来检测一个类型是否支持某些表达式呢?

0 投票
1 回答
619 浏览

c++ - decltype 的另一个问题

错误(来自 VS2010) error C2027: use of undefined type 'static_numeric_limits<T>'
错误(来自 gcc 4.6)
error: 'decltype ((lhs->getValue() + rhs->getValue()))' is not a valid type for a template constant parameter

为什么这不像我想象的那样工作?

0 投票
6 回答
2192 浏览

c++ - 为什么我们必须有延迟返回类型?

看看这个:

在这样的示例之后必须出现问题(顺便说一下整个示例按预期编译和工作),无论如何这里是问题:

我们真的必须拥有带有延迟返回类型的丑陋的哈巴狗语法吗?正如我在这个例子中证明的那样,它可以“正常方式”完成。

编辑(现在没有这个可怕的静态假人 - 所有人都在唱歌跳舞)