小编Nik*_*iou的帖子

难以理解的函数签名 - 返回对N个对象数组的引用

我遇到了以下签名

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)
  1. 这个c ++怎么样?你会怎么看?
  2. 我们不能从函数返回一个数组,只是指针,或者我们可以吗?

c++

25
推荐指数
2
解决办法
1258
查看次数

比较3种现代c ++方法将积分值转换为字符串

我试图选择一种将积分转换为字符串标准方法,所以我接着通过测量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)

c++ boost stl c++11

23
推荐指数
1
解决办法
3300
查看次数

is_integral vs is_integer:其中一个是多余的?

is_integralis_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)

c++ stl c++11

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

constexpr是编译器的"提示"(如内联)还是"绑定请求"?

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++ constexpr c++11

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

实现可变参数类型特征

介绍

我正在寻找一种模式将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

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

此操作是否正确排序?

在下面的代码中摘录了一段较大的代码

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++中唯一引入序列点的操作数.

TL;博士

对于那些发现折磨阅读评论的人:最初的问题没有恰当地提出,造成误解是不公平的.我对这个主题的看法有两个方面

  1. 三元运算符不会(以意想不到的方式)混乱序列点(其中,两个分支在C,C++的每个版本中排序 - 请参阅提供的链接)

  2. x = ++x问题吗?如coliru链接所示,我们编译为c ++ 14.那里的操作定义很好(对注释的引用),但旧版本的c ++和c将其视为未定义.那为什么会有警告? …

c c++

15
推荐指数
2
解决办法
891
查看次数

lambda可以转化为函数吗?

众所周知,lambda函数是引擎盖下的函子.

这段视频中(@约45:43)Bjarne说:

我提到lambda会转换为函数对象,如果方便的话会转换为函数

我可以看到这是一个编译器优化(即它不会改变lambda作为未命名的仿函数的感知,这意味着例如lambda仍然不会重载)但是有没有规定何时适用?

编辑

我理解术语翻译的方式(这就是我所要求的)与转换无关(我不会问lambdas是否可以转换为函数ptr等).通过翻译我的意思是"将lambda表达式编译成函数而不是函数对象".

cppreference中所述: lambda表达式构造一个未命名的prvalue临时对象,该对象具有唯一的非命名非联合非聚合类型,称为闭包类型.

问题是:这个对象可以被省略并且具有简单的功能吗?如果是,那么何时以及如何?


注意:我想象一个这样的规则是"不捕获任何东西",但我找不到任何可靠的来源来证实它

c++ lambda c++14

14
推荐指数
3
解决办法
817
查看次数

如何在swift中使用可选绑定?

在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)

如果是这样,布尔表达式是否短路?

swift

13
推荐指数
3
解决办法
2万
查看次数

为什么这种隐式转换(在不同的指针类型之间)有效?

我发现自己处于以下情况:

#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 pointers implicit-conversion

13
推荐指数
2
解决办法
1276
查看次数

是否(或将会)允许在lambda表达式中使用熟悉的模板语法?

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),因此会出现一些问题:

  • 这是一个实施问题吗?
  • 什么阻止了这部分被接受?
  • 最终将通用lambda引入语言的提案是哪一个?

c++ lambda language-lawyer c++14

13
推荐指数
2
解决办法
351
查看次数