小编Kno*_*abe的帖子

是int-> double-> int保证是保值吗?

如果我有一个int,将其转换为一个double,然后转换double回的int,我保证可以得到相同的值返回,我开始?换句话说,给定此功能:

int passThroughDouble(int input)
{
  double d = input;
  return d;
}
Run Code Online (Sandbox Code Playgroud)

我能保证passThroughDouble(x) == x所有intx吗?

c++ c++11

23
推荐指数
2
解决办法
898
查看次数

什么时候使用C++ 11*_until超时函数而不是相应的*_for函数?

在C++ 11中,*_until仅当使用稳定时钟(即,仅以不变速率向前移动的时钟)时,超时功能才"按预期"运行.因为system_clock不是一个稳定的时钟,这意味着像这样的代码可以表现得非常惊人:

using namespace std::chrono;
std::this_thread::sleep_until(system_clock::now() + seconds(10));
Run Code Online (Sandbox Code Playgroud)

除非在睡眠期间调整系统时钟,例如夏令时,否则这将导致当前线程休眠10秒.如果在休眠期间将时钟设置为一小时,则当前线程将休眠一小时10秒.

据我所知,*_untilC++ 11中的每个超时函数都有一个相应的*_for函数,它需要一个持续时间而不是一个时间点.例如,上面的代码可以重写如下:

using namespace std::chrono;
std::this_thread::sleep_for(seconds(10));
Run Code Online (Sandbox Code Playgroud)

这些*_for函数不应该担心在函数执行时调整的时钟,因为它们只是说等待多长时间,而不是等待时间应该是什么时间.

此问题不仅影响睡眠功能,对于future和try_lock函数的基于超时的等待也是如此.

我可以设想使用*_until具有不稳定时钟的功能的唯一情况是,当您想要考虑时钟调整时,例如,您想要睡到下周三凌晨3:30,即使有变化从现在到现在之间的夏令时间.还有其他情况下*_until功能比*_for功能更有意义吗?如果没有,是否安全地说,一般来说,*_for超时功能应优先于*_until功能?

c++ timeout c++11

22
推荐指数
1
解决办法
3873
查看次数

何时删除模板实例化比删除非模板重载更好?

假设我有一个与原始指针一起使用的模板:

template<typename T>
void processPointer(T* ptr);
Run Code Online (Sandbox Code Playgroud)

我不希望用void*指针调用它.看来我有两个选择.我可以删除非模板重载:

void processPointer(void*) = delete;
Run Code Online (Sandbox Code Playgroud)

或者我可以删除模板实例化:

template<>
void processPointer<void>(void*) = delete;
Run Code Online (Sandbox Code Playgroud)

声明非模板过载更容易(没有尖角支架).是否有理由我更喜欢删除模板实例化?

c++ templates overloading c++11

21
推荐指数
2
解决办法
1638
查看次数

std :: shared_ptr中的最大引用计数是多少?如果你试图超过它会发生什么?

如果我们假设std::shared_ptr存储引用计数(我意识到标准不需要,但我不知道任何没有的实现),那个引用计数具有有限的位数,这意味着存在最大数量的支持的引用.这导致了两个问题:

  • 这个最大值是多少?
  • 如果你试图超过它会发生什么(例如,通过复制引用具有最大引用计数的对象的std :: shared_ptr)?请注意,std::shared_ptr声明了复制构造函数noexcept.

该标准是否对这两个问题都有所了解?常见的实现如何,例如gcc,MSVC,Boost?

c++ reference-counting shared-ptr c++11

20
推荐指数
3
解决办法
3847
查看次数

为什么在类中初始化的非整数静态数据成员必须是constexpr?

在类定义中初始化静态整型数据成员可以声明constconstexpr,但在类定义中初始化非整数的静态数据成员必须是constexpr:

class MyClass {
  static const     int   w = 5;          // okay
  static constexpr int   x = 5;          // okay
  static const     float y = 1.5;        // error!
  static constexpr float z = 1.5;        // okay
};
Run Code Online (Sandbox Code Playgroud)

有人知道为什么不允许y的声明吗?标准中将其定为非法的部分是9.4.2/3,但为什么它是非法的?

c++ static-members constexpr c++11

20
推荐指数
1
解决办法
6658
查看次数

为什么从bind返回的对象会忽略额外的参数?

假设我有一个带两个参数的函数,

void f(int x, int y);
Run Code Online (Sandbox Code Playgroud)

我想绑定其中一个.我可以使用std::bind如下:

auto partiallyBoundF = std::bind(f, 10, _1);
Run Code Online (Sandbox Code Playgroud)

partiallyBoundF只需要一个参数,但我可以用多个参数调用它.超越第一个的论点甚至不必是一个有意义的类型:

partiallyBoundF(20, 0);
partiallyBoundF(0, 44, -99, "Hello", 4.5, true, []{});
Run Code Online (Sandbox Code Playgroud)

允许返回的对象bind传递额外参数的目的是什么?它允许编译调用错误,否则将被拒绝.

c++ stdbind c++11

19
推荐指数
1
解决办法
1600
查看次数

如何在Windows上从命令行运行clang?

在上周的Going Native会议上,Chandler Carruth宣布存在用于在Windows上运行clang的预构建二进制文件.相同的信息在这里的博客文章中.目标受众是Visual Studio的用户,但我想从命令行运行clang.

我运行安装程序并将LLVM bin目录添加到我的路径中,但是当我尝试编译"Hello world"时,我得到了:

C:\>clang hello.cpp
hello.cpp:1:10: fatal error: 'iostream' file not found
#include <iostream>
         ^
1 error generated.
Run Code Online (Sandbox Code Playgroud)

我找不到任何有关如何在Windows上配置运行clang的信息,我猜我在弄清楚如何告诉clang在哪里搜索标准库头后,我将不得不告诉它在哪里查看供图书馆链接.有人可以一步一步地引导我完成设置或指向我这样的演练吗?

c++ windows clang

19
推荐指数
2
解决办法
1万
查看次数

如果没有这样做,函数如何在新线程上"好像"运行?

C++标准的每个[futures.async]/3项目1,当一个函数与启动策略一起f传递时,将"运行"就像在新的执行线程中一样".std::asyncstd::launch::asyncf

鉴于它f可以做任何事情,包括无限循环和永久阻塞,一个实现如何提供在f自己的线程上运行而不实际在自己的线程上运行它的行为?也就是说,一个实现如何利用标准提供的"仿佛"摆动空间?

c++ multithreading c++11 stdasync

19
推荐指数
3
解决办法
496
查看次数

为什么自动初始值设定项的自动和模板类型推导会有所不同?

我理解,给定一个支撑的初始化程序,auto将推导出一种类型std::initializer_list,而模板类型推导将失败:

auto var = { 1, 2, 3 };   // type deduced as std::initializer_list<int>

template<class T> void f(T parameter);

f({ 1, 2, 3 });          // doesn't compile; type deduction fails
Run Code Online (Sandbox Code Playgroud)

我甚至知道在C++ 11标准中指定的位置:14.8.2.5/5 bullet 5:

[如果程序有,则这是一个非推导的上下文]一个函数参数,其关联参数是初始化列表(8.5.4),但参数没有std :: initializer_list或者可能是cv-qualified std :: initializer_list的引用类型.[ 例如:

模板void g(T);

克({1,2,3}); //错误:没有推断T的参数

- 结束例子 ]

我不知道或不理解的是为什么存在这种类型演绎行为的差异.C++ 14 CD中的规范与C++ 11中的规范相同,因此标准化委员会可能不会将C++ 11行为视为缺陷.

有人知道为什么auto推导出支撑初始值设定项的类型,但是不允许使用模板吗?虽然对"这可能是原因"形式的推测性解释很有意思,但我对那些知道为什么标准是按原样编写的人的解释特别感兴趣.

c++ templates c++11 list-initialization template-argument-deduction

18
推荐指数
2
解决办法
1016
查看次数

声明内联函数noexcept是否有意义?

据我所知,SO社区对于声明一个函数是否noexcept能够实现有意义的编译器优化存在分歧.(我正在谈论编译器优化,而不是基于的库实现优化move_if_noexcept.)出于这个问题的目的,我们假设noexcept确实可以进行有意义的代码生成优化.有了这个假设,声明inline函数noexcept是否有意义?假设这些函数实际上是内联的,这似乎要求编译器生成等效于调用​​站点函数try产生的代码块inline,因为如果在该区域出现异常,则terminate必须调用.没有noexcept,那个try街区似乎没必要.

我最初的兴趣在于声明Lambda函数是否有意义noexcept,因为它们是隐含的inline,但后来我意识到任何inline函数都会出现相同的问题,而不仅仅是Lambdas.

c++ inline noexcept c++11

18
推荐指数
1
解决办法
1477
查看次数