我遇到了以下签名
double(&rotate_vec(double(&val)[4]))[4];
Run Code Online (Sandbox Code Playgroud)
在评论中,它"声称" 接受并返回四个元素的数组.我的第一反应是,这甚至看起来不是标准的c ++,但是这个编译:
double(&rotate_vec(double(&val)[4]))[4]
{
// ...
return val;
}
int main()
{
double ar[4] = { 1, 2, 3, 5 };
rotate_vec(ar);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我试图选择一种将积分转换为字符串的标准方法,所以我接着通过测量3种方法的执行时间进行了一次小的性能评估
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <chrono>
#include <random>
#include <exception>
#include <type_traits>
#include <boost/lexical_cast.hpp>
using namespace std;
// 1. A way to easily measure elapsed time -------------------
template<typename TimeT = std::chrono::milliseconds>
struct measure
{
template<typename F>
static typename TimeT::rep execution(F const &func)
{
auto start = std::chrono::system_clock::now();
func();
auto duration = std::chrono::duration_cast< TimeT>(
std::chrono::system_clock::now() - start);
return duration.count();
}
};
// -----------------------------------------------------------
// 2. Define the convertion functions …
Run Code Online (Sandbox Code Playgroud) is_integral和is_integer似乎以同样的方式回答了同样的事情.
从链接到相关文档页面,is_integral
似乎缺少以下类型的特化
signed char
unsigned char
unsigned short
unsigned int
unsigned long
unsigned long long
Run Code Online (Sandbox Code Playgroud)
然而,一个已编译的示例(当然)也显示了它们在这些类型上的相同行为:
#include <iostream>
#include <type_traits>
using namespace std;
int main()
{
cout << is_integral<signed char >::value << endl;
cout << is_integral<unsigned char >::value << endl;
cout << is_integral<unsigned short >::value << endl;
cout << is_integral<unsigned int >::value << endl;
cout << is_integral<unsigned long >::value << endl;
cout << is_integral<unsigned long long>::value << endl;
return …
Run Code Online (Sandbox Code Playgroud) 是constexpr
编译器的指标还是强制执行行为?
手头的例子如下:
template<typename T>
std::size_t constexpr getID() { return typeid(T).hash_code(); }
Run Code Online (Sandbox Code Playgroud)
hash_code
是一个运行时常量,但即使请求编译时评估,此片段也会编译constexpr
.只有在期望编译时常量的返回值之后,才会注意到这不能用作constexpr函数.
那么是constexpr
一个"提示"(很像inline
关键字)或编译器的"绑定请求"?
我正在寻找一种模式将C++类型特征转换为它们的可变参数.一个方法来解决这个问题,将不胜感激,并生成编程模式,以自动执行任务将是理想的.
请考虑以下事项:
std::is_same<T, U>::value;
Run Code Online (Sandbox Code Playgroud)
我想写一个像这样的特征:
std::are_same<T1, T2, T3, T4>::value;
Run Code Online (Sandbox Code Playgroud)
实现这个非常简单are_same
; 寻求一般解决方案,我们可以为任何实现通用量化的可变特性提供工具:
template<template<class,class> class F, typename...Ts>
struct Univ;
template<template<class, class> class F, typename T, typename U, typename...Ts>
struct Univ<F, T, U, Ts...>
{
static const int value = F<T, U>::value && Univ<F, U, Ts...>::value;
};
template<template<class, class> class F, typename T>
struct Univ<F, T>
{
static const int value = 1;
};
Run Code Online (Sandbox Code Playgroud)
所以,例如are_same …
c++ templates generative-programming template-meta-programming c++11
在下面的代码中摘录了一段较大的代码
void func(int* usedNum, int wher) {
*usedNum = *usedNum + 1 > wher ? ++(*usedNum) : wher + 1;
}
int main(void) {
int a = 11, b = 2;
func(&a, b);
}
Run Code Online (Sandbox Code Playgroud)
一个警告发出
warning: operation on '* usedNum' may be undefined [-Wsequence-point]
*usedNum = *usedNum + 1 > wher ? ++(*usedNum) : wher + 1;
Run Code Online (Sandbox Code Playgroud)
代码有问题吗?
我怀疑的是这个以及它所说的部分
序列指向逻辑表达式,例如&&和|| 和三元运算符?:和逗号运算符表示在右侧操作数之前计算左侧操作数.这几个操作数是C++中唯一引入序列点的操作数.
对于那些发现折磨阅读评论的人:最初的问题没有恰当地提出,造成误解是不公平的.我对这个主题的看法有两个方面
三元运算符不会(以意想不到的方式)混乱序列点(其中,两个分支在C,C++的每个版本中排序 - 请参阅提供的链接)
是x = ++x
问题吗?如coliru链接所示,我们编译为c ++ 14.那里的操作定义很好(对注释的引用),但旧版本的c ++和c将其视为未定义.那为什么会有警告? …
众所周知,lambda函数是引擎盖下的函子.
在这段视频中(@约45:43)Bjarne说:
我提到lambda会转换为函数对象,如果方便的话会转换为函数
我可以看到这是一个编译器优化(即它不会改变lambda作为未命名的仿函数的感知,这意味着例如lambda仍然不会重载)但是有没有规定何时适用?
我理解术语翻译的方式(这就是我所要求的)与转换无关(我不会问lambdas是否可以转换为函数ptr等).通过翻译我的意思是"将lambda表达式编译成函数而不是函数对象".
如cppreference中所述: lambda表达式构造一个未命名的prvalue临时对象,该对象具有唯一的非命名非联合非聚合类型,称为闭包类型.
问题是:这个对象可以被省略并且具有简单的功能吗?如果是,那么何时以及如何?
注意:我想象一个这样的规则是"不捕获任何东西",但我找不到任何可靠的来源来证实它
在swift中,允许以下语法进行流控制
if let constantName = someOptional {
statements
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,真值背景的语义是什么?
是否允许表达链(如下所示)?
if let constantName = someOptional && constantName2 = someOptional2 {
statements
}
Run Code Online (Sandbox Code Playgroud)
如果是这样,布尔表达式是否短路?
我发现自己处于以下情况:
#include <stdio.h>
typedef struct T1 { int id; } T1;
typedef struct T2 { int id; } T2;
void f(T1 *ptr) { printf("f called\n"); }
int main(void)
{
T2 obj;
T2 *ptr = &obj;
f(ptr); // shouldn't this be a compilation error ?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当然,这是无效的C++,但在C中,程序打印 "f called".这有效吗?
(以防万一不清楚)如果"结构上"不同,程序仍然可以编译和运行T2
,例如
typedef struct T2 { double cc[23]; } T2;
Run Code Online (Sandbox Code Playgroud) C++ 14引入了通用lambdas.在浏览相关提案时,我发现了Faisal Vali,Herb Sutter和Dave Abrahams的N3418.其中第2.2节标题为:
2.2允许在lambda表达式中使用熟悉的模板语法
以下代码示例包括此类代码段
[]<int N>(int (&a)[N]) {}
Run Code Online (Sandbox Code Playgroud)
由于这些东西无法编译(使用gcc,clang和Visual Studio),因此会出现一些问题: