小编Sto*_*ica的帖子

使用sfinae的别名模板:语言允许吗?

我刚刚发现了以下技术.它看起来非常接近提议的概念语法之一,完全适用于Clang,GCC和MSVC.

template <typename T, typename = typename std::enable_if<std::is_rvalue_reference<T&&>::value>::type>
using require_rvalue = T&&;

template <typename T>
void foo(require_rvalue<T> val);
Run Code Online (Sandbox Code Playgroud)

我试图通过搜索请求找到它,比如"类型别名中的sfinae"并没有得到任何结果.这种技术有没有名称,语言实际上允许它吗?


完整的例子:

#include <type_traits>

template <typename T, typename = typename std::enable_if<std::is_rvalue_reference<T&&>::value>::type>
using require_rvalue = T&&;

template <typename T>
void foo(require_rvalue<T>)
{
}

int main()
{
    int i = 0;
    const int ic = 0;
    foo(i);            // fail to compile, as desired
    foo(ic);           // fail to compile, as desired
    foo(std::move(i)); // ok
    foo(123);          // ok
}
Run Code Online (Sandbox Code Playgroud)

c++ sfinae language-lawyer c++11

26
推荐指数
2
解决办法
467
查看次数

std :: byte是否定义良好?

C++ 17引入了这种std::byte类型.一种库类型,可以(据称)用于访问原始内存,但与字符类型分开,仅代表一块位.

到现在为止还挺好.但这个定义让我有点担心.如[cstddef.syn]中所述:

enum class byte : unsigned char {};
Run Code Online (Sandbox Code Playgroud)

我在SO上看到了两个答案,这些答案似乎暗示了上述内容的稳健性.这个答案认为(没有参考)具有基础类型的枚举具有与所述类型相同的大小和对齐要求.直观地说,这似乎是正确的,因为指定底层类型允许不透明的枚举声明.

但是,这个答案认为标准只保证两个具有相同底层类型的枚举是布局兼容的,而不是更多.

在阅读[dcl.enum]时,我忍不住注意到,实际上,底层类型仅用于指定枚举器的范围.没有提到尺寸或对齐要求.

我错过了什么?

c++ c++17

24
推荐指数
3
解决办法
1345
查看次数

std::vector::empty 和 std::empty 之间的区别

要检查向量是否v为空,我可以使用std::empty(v)or v.empty()。我查看了 cppreference 上的签名,但缺乏理解它们的知识。他们之间的关系如何?一个实现是否调用另一个实现?

我知道一个来自容器库,另一个来自迭代器库,但仅此而已。

c++ std

24
推荐指数
4
解决办法
2438
查看次数

有了保证的复制省略,为什么需要完全定义类?

这篇文章的后续内容.考虑以下:

class C;
C foo();
Run Code Online (Sandbox Code Playgroud)

这是一对有效的声明.C仅仅在声明函数时不需要完全定义.但是如果我们要添加以下功能:

class C;
C foo();
inline C bar() { return foo(); }
Run Code Online (Sandbox Code Playgroud)

然后突然C需要一个完全定义的类型.但有了保证的复制权限,其成员都不是必需的.没有复制甚至移动,该值在其他地方初始化,并且仅在调用者(to bar)的上下文中被销毁.

所以为什么?标准中有什么禁止它?

c++ language-lawyer c++17

22
推荐指数
3
解决办法
1545
查看次数

C++中`std :: sort`比较器的不同类型

当我们提供比较器函数时std::sort,我们使用以下重载:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );
Run Code Online (Sandbox Code Playgroud)

其中比较器函数std::sort应具有以下语法:

bool cmp(const Type1 &a, const Type2 &b);
Run Code Online (Sandbox Code Playgroud)

但正如你所看到的a,b可能有不同的类型.cppreference说:

类型Type1Type2必须使得类型的对象RandomIt 可以被解除引用,然后隐式转换为它们两者.

但是当我们尝试对它进行排序时,我仍然无法准确理解我们如何在单个数组中有两种不同的类型.

是否有人可以为std::sort比较器功能提供不同类型的小例子?

c++

21
推荐指数
3
解决办法
2066
查看次数

C ++强制函数参数评估顺序

我了解当我调用诸如

a(b(),c());
Run Code Online (Sandbox Code Playgroud)

那么就可以在<= C ++ 14中未定义其行为,而在> = C ++ 17中未指定其行为,这是由编译器确定是求值b还是c首先求值。

我想知道强制执行评估命令的最佳方法。我将编译为C ++ 14。

立即想到的是这样的事情:

#include <iostream>

int count = 5;
auto increment(){
    return count++;
}

template <typename A, typename B>
auto diff(A && a, B && b){
   return a - b;
}

int main() {
    auto && a = increment();
    auto && b = increment();
    auto c = diff(a,b);
}
Run Code Online (Sandbox Code Playgroud)

我处于不确定的行为状态吗?或者这是如何“强制”执行评估命令的?

c++ c++14

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

为什么 std::derived_from 概念是通过添加 cv 限定符的附加可转换性测试来实现的?

在 GCC C++20 概念库中,它有

template<typename _Derived, typename _Base>
    concept derived_from = __is_base_of(_Base, _Derived)
    && is_convertible_v<const volatile _Derived*, const volatile _Base*>;
Run Code Online (Sandbox Code Playgroud)
  1. 为什么要求__is_base_of(_Base, _Derived)不够?
  2. const volatile测试中需要用到什么?

c++ libstdc++ c++-concepts c++20

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

将const函数引用绑定到lambda

这段代码

int(&foo)(int, int) = [](int a, int b) { return a + b; };
Run Code Online (Sandbox Code Playgroud)

不会编译,因为显然不能使用临时初始化非常量引用。我在哪里放const

c++ lambda c++11

17
推荐指数
2
解决办法
814
查看次数

什么是C++模块权限?

我在C++模块的上下文中看到了一些对"purview"这个术语的引用,例如在https://gcc.gnu.org/wiki/cxx-modules中:

Baz (); // Baz's declaration visible from purview Quux interface
Run Code Online (Sandbox Code Playgroud)

究竟什么是C++模块权限?

c++ terminology c++-modules

16
推荐指数
1
解决办法
1020
查看次数

type(myVar)和(type)myVar有什么区别?

我将在cplusplus.com上完成完整的教程,手动编写和编译每个示例.我经常偶然发现让我感到困惑的事情.

我目前正在学习这一部分:http://www.cplusplus.com/doc/tutorial/structures/.只有阅读教程才能轻易忽略一些细微之处.手动输入所有东西的优点是这些细节确实很突出.

在上面的页面中,有两个示例程序.一个有这条线:

stringstream(mystr) >> yours.year;
Run Code Online (Sandbox Code Playgroud)

另一个有这条线:

(stringstream) mystr >> pmovie->year;
Run Code Online (Sandbox Code Playgroud)

我不明白的是type (myVar) = x;和之间的区别(如果有的话)(type) myVar = x;.

我没有按顺序执行整个教程.我查了但是没有找到这个地址,但我可能错过了它.

  • 有区别吗?
  • 是否有一种首选方式而不是另一种方式?

c++

15
推荐指数
1
解决办法
2574
查看次数