小编Jan*_*n15的帖子

左值ref对象上的Constexpr成员函数:Clang和gcc不同意

当一个类具有constexpr成员函数并且正在constexpr上下文中的l值对象上对该成员函数进行求值时,clang和gcc会不同意结果是否为constexpr值。为什么?有没有既不需要默认可构造性又不需要复制可构造性的解决方法?

当按值传递对象时,两个编译器都将成功编译。

lang版本的树干8、7: static_assert expression is not an integral constant expression

Gcc版本trunk,8.1、7.4:编译没有错误

#include <array>

using A = std::array<int, 10>;

void foo(const A& a){
    // clang: static_assert expression is not an integral constant expression
    static_assert(a.size() > 0, "");
}


void foo2(A a){
    // this compiles on both clang and gcc
    static_assert(a.size() > 0, "");
}

// Some custom code with the same symptom:
class B{
  public:
    constexpr int size()const{
        return 42;
    }
};

void foo3(const B& b){
    // clang: static_assert …
Run Code Online (Sandbox Code Playgroud)

c++ constexpr c++11

8
推荐指数
1
解决办法
113
查看次数

docker run --device 和 docker run --volume 有什么区别?

如果一切都“只是”Linux 中的一个文件,那么文件/节点与其他文件有何/dev不同,以至于 docker 必须以不同的方式处理它们?docker 对设备文件有什么不同的处理方式?我希望它是更详细的绑定命令的简写?

事实上,在对设备文件(例如 )进行常规绑定挂载后--volume /dev/spidev0.0:/dev/spidev0.0,用户在尝试访问设备时会在 docker 容器内收到“权限被拒绝”的消息。通过 绑定时--device /dev/spidev0.0:/dev/spidev0.0,它按预期工作。

linux docker

6
推荐指数
1
解决办法
9943
查看次数

如果 str 是“字符串切片”,为什么 std::slice 毯子实现不能在 str 上工作?

Rust 书籍文档中,str被称为切片(在书中他们说切片到 a String)。因此,我希望str其行为与任何其他切片相同:例如,我应该能够使用std::slice. 然而,情况似乎并非如此:

虽然这按预期工作(游乐场):

fn main() {
    let vec = vec![1, 2, 3, 4];
    let int_slice = &vec[..];
    for chunk in int_slice.chunks(2) {
        println!("{:?}", chunk);
    }
}
Run Code Online (Sandbox Code Playgroud)

这无法编译:(游乐场

fn main() {
    let s = "Hello world";
    for chunk in s.chunks(3) {
        println!("{}", chunk);
    }
}
Run Code Online (Sandbox Code Playgroud)

并出现以下错误消息:

error[E0599]: no method named `chunks` found for type `&str` in the current scope
 --> src/main.rs:3:20
  |
3 …
Run Code Online (Sandbox Code Playgroud)

string slice rust

5
推荐指数
1
解决办法
188
查看次数

文字双浮点转换等于浮点文字吗?

浮点文字的直接赋值float x = 3.2f;double隐式转换为 float之间的位表示形式是否存在差异float x2 = 3.2;

即是

#define EQUAL(FLOAT_LITERAL)\
  FLOAT_LITERAL##f == static_cast<float>(FLOAT_LITERAL)
EQUAL(3.2) && EQUAL(55.6200093490) // etc ... 
Run Code Online (Sandbox Code Playgroud)

true 对于所有浮点文字?

我问这个问题,因为如果数字在 float 的值范围内,clang 或 gcc 不会抱怨缩小转换:警告已启用-Wnarrowing

float f {3.422222222222222222222222222222246454}; // no warning/ error although it should definitely lose precision
float f2 {static_cast<double>(std::numeric_limits<float>::max()) + 1.0}; // no warning/ error
float f3 {3.5e38}; // error: narrowing conversion of '3.5e+38' from 'double' to 'float' inside { } [-Wnarrowing]
Run Code Online (Sandbox Code Playgroud)

编译器进行实际范围检查很棒,但这是否足够?

c++ math floating-point

4
推荐指数
2
解决办法
209
查看次数

Fish shell:接受和运行命令建议的快捷方式

是否可以创建一个快捷方式,例如“Shift+Return”来接受并运行显示的建议?

默认的键绑定需要按箭头键,这涉及远离键的移动。

shell fish

4
推荐指数
2
解决办法
490
查看次数

检查两个模板模板参数是否相同

是否有标准(std)方法可以检查两个模板,而不是两个模板实例,以获得相等性?

当我有两个模板模板参数,我想检查它是否相等,理想情况下,我想写

template <template <class> class T1, template <class> class T2>
class Foo{
  static_assert(std::is_same<T1, T2>::value, "T1 and T2 must be same");
};
Run Code Online (Sandbox Code Playgroud)

但不能,因为std::is_same需要类型模板参数而不是模板模板参数.

我当前的"解决方案"是我用随机类型(例如void)进行实例化,然后检查是否相等:

template <template <class> class T1, template <class> class T2>
class Foo{
  static_assert(std::is_same<T1<void>, T2<void>>::value, "T1 and T2 must be same");
};
Run Code Online (Sandbox Code Playgroud)

这一切都很好,直到T1T2不能用我选择的随机类型(这里void)实例化.

我想我可以编写自己的类型特征is_same_template,但我有点想绕过它.

c++

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

标签 统计

c++ ×3

c++11 ×1

constexpr ×1

docker ×1

fish ×1

floating-point ×1

linux ×1

math ×1

rust ×1

shell ×1

slice ×1

string ×1