对于 common_type,T declval() 而不是 T && declval()

2024-03-07

使用不是更好吗std::declval声明形式:

template< class T > T declval(); // (1)

然后是当前的:

template< class T > T && declval(); // (2)

for std::common_type(可能仅出于当前目的而使用不同的名称)?

的行为common_type using (1)更接近于行为三元运算符 (but 不使用 std::decay_t)比使用时的行为(2):

template< typename T >
T declval();

template <class ...T> struct common_type;

template< class... T >
using common_type_t = typename common_type<T...>::type;

template <class T>
struct common_type<T> {
    typedef T type;
};

template <class T, class U>
struct common_type<T, U> {
    typedef decltype(true ? declval<T>() : declval<U>()) type;
};

template <class T, class U, class... V>
struct common_type<T, U, V...> {
    typedef common_type_t<common_type_t<T, U>, V...> type;
};

#include <type_traits>
#include <utility>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunevaluated-expression"
int
main()
{
    int i{};
    static_assert(std::is_same< int &, decltype((i)) >{});
    static_assert(std::is_same< int  , std::common_type_t< decltype((i)), decltype((i)) > >{}); 
    static_assert(std::is_same< int &, decltype(true ? i : i) >{});
    static_assert(std::is_same< int &, common_type_t< decltype((i)), decltype((i)) > >{});

    int && k{};
    static_assert(std::is_same< int &&, decltype(k) >{});
    static_assert(std::is_same< int   , std::common_type_t< decltype(k), decltype(k) > >{}); 
    static_assert(std::is_same< int &&, decltype(true ? std::move(k) : std::move(k)) >{}); 
    static_assert(std::is_same< int &&, common_type_t< decltype(k), decltype(k) > >{});
    return 0;
}
#pragma clang diagnostic pop

实例 http://coliru.stacked-crooked.com/a/5db372e89a3ac55b.

这种方法有什么缺点?这是真的吗?(1) in decltype()上下文类型T应该是可构造的(根本,即应该至少有一个构造函数)和/或可破坏?

参考文章 http://en.cppreference.com/w/cpp/types/common_type said:

对于非专门化的 std::common_type,确定每对 T1、T2 之间的公共类型的规则正是在未计算的上下文中确定三元条件运算符的返回类型的规则,其中任意第一个参数为 bool 类型,并且xvalues of type T1 and T2 (since C++17) std::declval<T1>() and std::declval<T2>() (until C++17)作为第二个和第三个操作数。The common type is the result of std::decay applied to the type of the ternary conditional (since C++14).

我认为这很可能是最后一句话(emphasized)不应该只是since C++14但是也until C++17公平起见。否则,即使在之后,引用的第一句也不会成立C++17并且会存在一些缺陷。

有一些澄清应该-std 通用类型-使用-std 衰减 https://stackoverflow.com/questions/21975812/关于的评论std::common_type问题,但这只是当前问题的背景信息。


优点:

template <class T> T&& declval();

它适用于any type T,而简单地返回T不适用于不可返回的类型(例如函数、数组)和不可销毁的类型(例如私有/受保护/删除的析构函数、抽象基类)。

当然,缺点就是common_type<int, int>最终成为int&&,然后你需要添加decay这使得common_type<int&, int&> be int- 这也没有意义。这里没有胜利。


最终,我认为我们只需要一些语言功能,在未评估的上下文中,“给我一些类型T“适用于任何T, that really给你一个T(而不是一个T&&).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对于 common_type,T declval() 而不是 T && declval() 的相关文章

  • 使用 lambda 表达式注册类型

    我想知道如何在 UnityContainer 中实现这样的功能 container RegisterType
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • C# 数据表更新多行

    我如何使用数据表进行多次更新 我找到了这个更新 1 行 http support microsoft com kb 307587 my code public void ExportCSV string SQLSyntax string L
  • Python 属性和 Swig

    我正在尝试使用 swig 为一些 C 代码创建 python 绑定 我似乎遇到了一个问题 试图从我拥有的一些访问器函数创建 python 属性 方法如下 class Player public void entity Entity enti
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • IQueryable 单元或集成测试

    我有一个 Web api 并且公开了一个端点 如下所示 api 假期 name name 这是 Web api 的控制器 get 方法 public IQueryable
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 如何在 C 中安全地声明 16 位字符串文字?

    我知道已经有一个标准方法 前缀为L wchar t test literal L Test 问题是wchar t不保证是16位 但是对于我的项目 我需要16位wchar t 我还想避免通过的要求 fshort wchar 那么 C 不是 C
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File

随机推荐

  • 覆盖 artisan migrate 命令的默认 Laravel 数据库配置

    对于我的数据库 MySQL 我有两个用户帐户 一个 mydbuser 对于对所有表具有选择 插入 更新 删除权限的一般应用程序访问 其他 mydbadmin 具有管理表等的权限 CREATE USER mydbadmin IDENTIFIE
  • C# 错误 - 并非所有代码路径都返回值

    我知道还有其他类似的帖子 但其他帖子并没有帮助我找到问题的解决方案 我有 1 个表格和 4 个带有方法的类 并且在名为 成本 的类中出现问题 将所有其他 3 个类放入其中 我将在这里发布四个课程 头等舱 Alimenta ao using
  • SQL 查询 - 返回连接表的前两条记录的连接

    我有两张桌子 Patient pk患者ID 名 Surname 患者状态 pkPatientStatusId fk患者 ID 状态码 开始日期 EndDate Patient gt 患者状态是一对多的关系 我想知道是否可以在 SQL 中进行
  • 替换 Swift 2.2 中的 _stdlib_getDemangledTypeName()

    最新版本的 Swift 2 2 删除了 stdlib getDemangledTypeName 我有什么选择来替代它 我目前正在这样的调试消息中使用 let debugStr stdlib getDemangledTypeName self
  • 在 Magento 中操作多个购物车规则

    上次我遇到困难时 我曾询问过如何操纵购物车规则本文 https stackoverflow com questions 18401781 manipulating shopping cart rules 现在 我在购物车规则中添加了更多条件
  • 如何在 postgres 中对结果执行按位运算符?

    如果我有几行 并且我想对结果执行按位或 我该如何在 Postgres 9 x 中执行此操作 例如 我的表包含 Name col1 col2 John 1 2 Walter 1 1 Ron 1 2 我知道想要执行 select 语句 以便从列
  • 如何向非超链接 HTML 标记添加工具提示

    是否有办法向非超链接添加工具提示 IE 我希望当鼠标滑过文本时将鼠标悬停在工具提示上 我希望有一个不基于超链接的工具提示的工作示例 Thanks 如果您所说的工具提示是指title属性 您可以将其应用于许多不同的 HTML 元素 例如spa
  • 任何 Apache HttpClient 4.4 信任自签名证书的示例

    我变了HttpClient版本从旧版本到新版本4 4 并得到了许多已弃用的方法和类 原始代码可以信任自签名证书 我想替换为新方法和类 任何人都可以给我一个如何替换的指南或任何示例代码吗 谢谢 感谢您的回复 我找到了示例代码如下 SSLCon
  • Shinydashboard 标签框高度

    我正在尝试创建一个tabBox横跨整个mainPanel 我能够获得跨越整个屏幕的宽度 但无法获得同样的高度 我不希望使用像素 或其他单位 的绝对值 因为我希望该应用程序能够在不同的屏幕上使用 我玩了这个例子和example http rs
  • 用于图形的 Java 库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 用于操作图形 特别是用于社交网络分析 的最佳 Java 库是什么 我见过荣格 但我想知道你是否知道更好的
  • Shadowbox - 打开内联元素

    我正在使用 Shadowbox 和 jQuery 我可以在页面加载时打开它 我想做的是 打开影子框并显示一个表单 用户可以在其中输入他们的电子邮件地址 然后我想通过ajax提交所述表单 我将表单转储到包含在隐藏 div 中的页面上 其 id
  • Apache RewriteRule 将整个 URL 作为参数传递

    目前我的阿帕奇RewriteRule仅将原始 URL 的路径作为查询参数传递给重写的 URL 如何将整个 URL 包括方案和权限等 作为参数发送到重写的 URL I know REQUEST URI 只传递路径 我看不到任何传递整个 URL
  • Asp.Net MVC 4 使用 oAuth2 进行谷歌

    我们正在尝试为现有的 asp net MVC 4 项目启用 使用 google 登录 但现在google已经宣布弃用OpenID 2 0并建议使用OAuth2 我们发现了这个link http www asp net mvc tutoria
  • Aurelia 使可绑定的行为在对象属性上可观察

    在 Aurelia 绑定中 如果在组件中我们对属性使用可观察装饰 并且如果该属性是一个对象 那么我们将订阅该对象的所有属性 例如 import observable from aurelia framework export class C
  • 在 Rust 中,“as”是一个运算符吗?

    Rust 参考目前说了以下内容the as操作员 https doc rust lang org reference html type cast expressions 7 2 12 5 类型转换表达式 类型转换表达式用二元运算符表示as
  • 将开源 CMS 框架集成到现有的 MVC3 / MVC4 站点中 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我的任务是寻找一个可以慢慢集成到一组现有网站中的开源 CMS 通过这种方式 页面可以一页一页地传送到
  • 替换 uiimage 中的特定颜色

    假设我只想更改给定 UIImageView 中的特定颜色 每个像素 如何使用以下代码将所有白色像素更改为 darkGray UIImage changeColorForImage UIImage image toColor UIColor
  • 将 pandas df 写入 csv 时出现 Unicode 编码错误

    我清理了 400 个 Excel 文件 并使用 pandas 将它们读入 python 并将所有原始数据附加到一个大 df 中 然后当我尝试将其导出到 csv 时 df to csv path header True index False
  • 在 Python 2.7 中将 print 语句分配给函数中的变量

    我正在尝试将 print 语句分配给函数中的变量 def namer fn ln Smith return value default value r print Your name is fn ln return r 但是当我运行该模块时
  • 对于 common_type,T declval() 而不是 T && declval()

    使用不是更好吗std declval声明形式 template lt class T gt T declval 1 然后是当前的 template lt class T gt T declval 2 for std common type