我正在为演员运用新的显式.如果你写的东西
struct Data {
    explicit operator string(); 
};

不可能将数据意外转换为字符串. darget数据类型bool是一个例外:在某些情况下,即使将其标记为显式 – 上下文转换,也允许隐式转换.因此,您可以在if(…)中使用此类型的数据,例如:

struct Ok {
    explicit operator bool(); // allowed in if(...) anyway
};

段落“25.4.(2)排序和相关操作”似乎允许这样的标准容器的比较函数,如设置.但是我的gcc-4.7.0尝试失败了,我注意到,如果这是gcc的错误理解或错误,

#include <set>

struct YesNo { // Return value type of Comperator
    int val_;
    explicit YesNo(int y) : val_{y} {}
    /* explicit */ operator bool() { return val_!=0; }
};

static const YesNo yes{1};
static const YesNo no{0};

struct LessYesNo {  // Comperator with special return values
    YesNo operator()(int a,int b) const {
        return a<b ? yes : no;
    }
};

int main() {
    std::set<int,LessYesNo> data {2,3,4,1,2};
}

没有明确的操作符bool()之前的示例编译.而我对“25.4.(2)”的理解是,也应该用“明确的”来编译.

我明白了Std是否正确的设置也是明确的bool转换应该工作?这可能是gcc中的错误,还是我明白错了?

解决方法

我的阅读标准有点不同 –
第25.4节处理排序算法,而不是排序容器; 25.4.(1)中建立的上下文意味着25.4.(2)中规定的比较对象的属性适用于25.4中的算法,不适用于排序容器

1
All the operations in 25.4 have two versions: one that takes a
function object of type Compare and one that uses an operator.

2
Compare is a function object type (20.8). The return value of the
function call operation applied to an object of type Compare,when
contextually converted to bool (4),yields true if the first argument
of the call is less than the second,and false otherwise. Compare comp
is used throughout for algorithms assuming an ordering relation. It is
assumed that comp will not apply any non-constant function through the
dereferenced iterator.

我不知道你的例子是否应该工作,但我不认为这里适用第25.4节.

使用vector和std :: sort进行快速测试:

#include <list>
#include <algorithm>

struct YesNo { // Return value type of Comperator
    int val_;
    explicit YesNo(int y) : val_{y} {}
    explicit operator bool() { return val_!=0; }
};

static const YesNo yes{1};
static const YesNo no{0};

struct LessYesNo {  // Comperator with special return values
    YesNo operator()(int a,int b) const {
        return a<b ? yes : no;
    }
};

int main() {
    std::vector<int> data {2,2};
    std::sort(std::begin(data),std::end(data),LessYesNo());
}

编辑:

关联容器的Compare参数按照第25.4节定义:

1 Associative containers provide fast retrieval of data based on keys. The library provides four basic kinds of associative containers: set,multiset,map and multimap.

2 Each associative container is parameterized on Key and an ordering relation Compare that
induces a strict weak ordering (25.4) on elements of Key. In addition,map and multimap associate an arbitrary type T with the Key. The object of type Compare is called the comparison object of a container.

和23.对于比较类型没有其他条件,据我所见,所以假设满足25.4约束的类型同样适用,似乎是合理的.

c – 将明确的bool类型隐式转换为排序容器?的更多相关文章

  1. HTML5页面无缝闪开的问题及解决方案

    这篇文章主要介绍了HTML5页面无缝闪开方案,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  2. ios – 将容器带到视图前方

    我怎样才能解决这个问题?

  3. ios – 如何使用XCode 6.4下载和替换AppGroup容器

    我知道如何使用XCode6的Devices窗口下载和替换特定iOS应用程序的文件系统容器.但是对于我正在开发的应用程序,我需要能够下载和替换共享的AppGroup容器以进行调试.这将使我能够模拟AppGroup文件夹内容中的情况以进行测试.任何人都可以告诉我如何做到这一点?

  4. ios – 在UITableView上移动UIView – 触摸顶部UIView仍然选择表行

    =======用一些代码编辑:这是我在容器B中所做的代码.这是B帧的一个非常直接的动画.self.view是ContainerB的UIView.所有视图都在屏幕上通过故事板.其他容器是B的子视图.请让我知道你想看到的其他代码.解决方法嗯……不确定这是否适用于您的情况,但尝试在容纳所有其他容器的更大容器中管理您的动画.我的意思是,创建一个包含A,B,O及其子视图的ContainerZ,并尝试从Z中设置B的位置动画,检查B是否在A前面.

  5. ios – 与容器视图通信的最佳实践是什么?

    我最近经常使用容器VC,我一直想知道主Vc和容器VC之间的最佳通信方式是什么.现在我正在使用通知,但我宁愿使用更好的东西.如何获取指向容器VC的指针,以便至少可以使用委托?

  6. ios – 编程嵌入UIViewController?

    我有一个带有一个容器视图的UIViewController的Storyboard设置,以便我可以在其中嵌入另一个UIViewController.在某种情况下,我需要更改嵌入式视图控制器.在我的故事板中,我的容器视图不能有两个区段.这导致我以编程方式进行.我的容器视图在我的故事板,没有连接的嵌入.现在从这一点开始,我如何以编程方式嵌入我所选择的UIViewController对象?

  7. ios – 使用Swift访问非默认的Cloudkit容器

    我有一个IOS8应用程序,它成功地将记录写入其默认的Cloudkit容器.现在我希望在OSX下的不同应用程序中读取和处理这些记录.我已经设置了具有iCloud访问权限的新应用程序,并选中了“指定自定义容器”选项.这已成功找到原始应用程序和我的容器没有错误要在Capabilities界面上修复.我的所有搜索都告诉我“同一个开发人员签署的两个应用程序可能共享同一个容器”但我找不到的任何教程文档都告诉我

  8. 在Xcode中,有没有办法对方法的下拉列表进行排序

    在Xcode中,有一个首选项可以按字母顺序对“编辑器函数”弹出窗口进行排序,这很棒.但是,这并未考虑同样出现在此列表中的#pragma标记标题.将这个列表首先按字母顺序排序,然后按#pragmaheading,然后按方法排序会很棒.这可能吗?

  9. ios – 嵌入在容器视图中的UINavigationController,显示大小错误的表视图控制器

    我正在尝试找到解决这种情况的方法:我有一个UITabBarController它的一个segue连接到一个容器视图控制器(BannerViewController),我用来嵌入一个UINavigationController,导航控制器推送其他容器视图控制器(EventListContainerviewController),每个包含一个tableview控制器.这是我的故事板上的一个屏幕问题是最

  10. ios – 按键键入字典的Swift排序数组,其中value是可选的AnyObject

    我正在直接从Parse中提取一系列字典并将它们显示在表格中.所以我真的很想处理我所掌握的数据结构.PFObject是[String:AnyObject?解决方法Swift无法比较任何两个对象.您必须先将它们转换为特定类型:如果有多个字典没有指定键的值,它们将被放置在结果数组的末尾,但它们的相对顺序是不确定的.

随机推荐

  1. 从C到C#的zlib(如何将byte []转换为流并将流转换为byte [])

    我的任务是使用zlib解压缩数据包(已接收),然后使用算法从数据中生成图片好消息是我在C中有代码,但任务是在C#中完成C我正在尝试使用zlib.NET,但所有演示都有该代码进行解压缩(C#)我的问题:我不想在解压缩后保存文件,因为我必须使用C代码中显示的算法.如何将byte[]数组转换为类似于C#zlib代码中的流来解压缩数据然后如何将流转换回字节数组?

  2. 为什么C标准使用不确定的变量未定义?

    垃圾价值存储在哪里,为什么目的?解决方法由于效率原因,C选择不将变量初始化为某些自动值.为了初始化这些数据,必须添加指令.以下是一个例子:产生:虽然这段代码:产生:你可以看到,一个完整的额外的指令用来移动1到x.这对于嵌入式系统来说至关重要.

  3. 如何使用命名管道从c调用WCF方法?

    更新:通过协议here,我无法弄清楚未知的信封记录.我在网上找不到任何例子.原版的:我有以下WCF服务我输出添加5行,所以我知道服务器是否处理了请求与否.我有一个.NET客户端,我曾经测试这一切,一切正常工作预期.现在我想为这个做一个非托管的C客户端.我想出了如何得到管道的名称,并写信给它.我从here下载了协议我可以写信给管道,但我看不懂.每当我尝试读取它,我得到一个ERROR_broKEN_P

  4. “这”是否保证指向C中的对象的开始?

    我想使用fwrite将一个对象写入顺序文件.班级就像当我将一个对象写入文件时.我正在游荡,我可以使用fwrite(this,sizeof(int),2,fo)写入前两个整数.问题是:这是否保证指向对象数据的开始,即使对象的最开始可能存在虚拟表.所以上面的操作是安全的.解决方法这提供了对象的地址,这不一定是第一个成员的地址.唯一的例外是所谓的标准布局类型.从C11标准:(9.2/20)Apointe

  5. c – 编译单元之间共享的全局const对象

    当我声明并初始化一个const对象时.两个cpp文件包含此标头.和当我构建解决方案时,没有链接错误,你会得到什么如果g_Const是一个非const基本类型!PrintInUnit1()和PrintInUnit2()表明在两个编译单元中有两个独立的“g_Const”具有不同的地址,为什么?

  6. 什么是C名称查找在这里? (&amp;GCC对吗?)

    为什么在第三个变体找到func,但是在实例化的时候,原始变体中不合格查找找不到func?解决方法一般规则是,任何不在模板定义上下文中的内容只能通过ADL来获取.换句话说,正常的不合格查找仅在模板定义上下文中执行.因为在定义中间语句时没有声明func,并且func不在与ns::type相关联的命名空间中,所以代码形式不正确.

  7. c – 在输出参数中使用auto

    有没有办法在这种情况下使用auto关键字:当然,不可能知道什么类型的.因此,解决方案应该是以某种方式将它们合并为一个句子.这可用吗?解决方法看起来您希望默认初始化给定函数期望作为参数的类型的对象.您无法使用auto执行此操作,但您可以编写一个特征来提取函数所需的类型,然后使用它来声明您的变量:然后你就像这样使用它:当然,只要你重载函数,这一切都会失败.

  8. 在C中说“推动一切浮动”的确定性方式

    鉴于我更喜欢将程序中的数字保留为int或任何内容,那么使用这些数字的浮点数等效的任意算术最方便的方法是什么?说,我有我想写通过将转换放在解析的运算符树叶中,无需将表达式转化为混乱是否可以使用C风格的宏?应该用新的类和重载操作符完成吗?解决方法这是一个非常复杂的表达.更好地给它一个名字:现在当您使用整数参数调用它时,由于参数的类型为double,因此使用常规的算术转换将参数转换为double用C11lambda……

  9. objective-c – 如何获取未知大小的NSArray的第一个X元素?

    在objectiveC中,我有一个NSArray,我们称之为NSArray*largeArray,我想要获得一个新的NSArray*smallArray,只有第一个x对象…

  10. c – Setprecision是混乱

    我只是想问一下setprecision,因为我有点困惑.这里是代码:其中x=以下:方程的左边是x的值.1.105=1.10应为1.111.115=1.11应为1.121.125=1.12应为1.131.135=1.14是正确的1.145=1.15也正确但如果x是:2.115=2.12是正确的2.125=2.12应为2.13所以为什么在一定的价值是正确的,但有时是错误的?请启发我谢谢解决方法没有理由期望使用浮点系统可以正确地表示您的帖子中的任何常量.因此,一旦将它们存储在一个双变量中,那么你所拥有的确切的一

返回
顶部