如果我有一个int,将其转换为一个double,然后转换double回的int,我保证可以得到相同的值返回,我开始?换句话说,给定此功能:
int passThroughDouble(int input)
{
double d = input;
return d;
}
Run Code Online (Sandbox Code Playgroud)
我能保证passThroughDouble(x) == x所有int的x吗?
在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功能?
假设我有一个与原始指针一起使用的模板:
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)
声明非模板过载更容易(没有尖角支架).是否有理由我更喜欢删除模板实例化?
如果我们假设std::shared_ptr存储引用计数(我意识到标准不需要,但我不知道任何没有的实现),那个引用计数具有有限的位数,这意味着存在最大数量的支持的引用.这导致了两个问题:
std::shared_ptr声明了复制构造函数noexcept.该标准是否对这两个问题都有所了解?常见的实现如何,例如gcc,MSVC,Boost?
在类定义中初始化静态整型数据成员可以声明const或constexpr,但在类定义中初始化非整数的静态数据成员必须是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,但为什么它是非法的?
假设我有一个带两个参数的函数,
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传递额外参数的目的是什么?它允许编译调用错误,否则将被拒绝.
在上周的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++标准的每个[futures.async]/3项目1,当一个函数与启动策略一起f传递时,将"运行"就像在新的执行线程中一样".std::asyncstd::launch::asyncf
鉴于它f可以做任何事情,包括无限循环和永久阻塞,一个实现如何提供在f自己的线程上运行而不实际在自己的线程上运行它的行为?也就是说,一个实现如何利用标准提供的"仿佛"摆动空间?
我理解,给定一个支撑的初始化程序,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
据我所知,SO社区对于声明一个函数是否noexcept能够实现有意义的编译器优化存在分歧.(我正在谈论编译器优化,而不是基于的库实现优化move_if_noexcept.)出于这个问题的目的,我们假设noexcept确实可以进行有意义的代码生成优化.有了这个假设,声明inline函数noexcept是否有意义?假设这些函数实际上是内联的,这似乎要求编译器生成等效于调用站点函数try产生的代码块inline,因为如果在该区域出现异常,则terminate必须调用.没有noexcept,那个try街区似乎没必要.
我最初的兴趣在于声明Lambda函数是否有意义noexcept,因为它们是隐含的inline,但后来我意识到任何inline函数都会出现相同的问题,而不仅仅是Lambdas.
c++ ×10
c++11 ×9
templates ×2
clang ×1
constexpr ×1
inline ×1
noexcept ×1
overloading ×1
shared-ptr ×1
stdasync ×1
stdbind ×1
template-argument-deduction ×1
timeout ×1
windows ×1