小编Fil*_*efp的帖子

普通的`char`可能有陷阱值吗?

自述

"陷阱值",或"陷阱表示"类型T,是一个比特组合(底层存储的),其产生的无效的值T.试图解释为无效值的表示将导致未定义的行为.


让战斗开始......

另一个问题已经开始了一个激烈的讨论char,以及实现具有陷阱表示的可能性.

问题:

  • char可能有陷阱值?

前面讨论中提到的行情:

在前面的论证中,这些部分是引用最多的部分,它们是否相矛盾?

3.9.1p1 基本类型 [basic.fundamental]

它是实现定义的,是否char可以保持负值.可以显式声明字符signedunsigned.

char,一个signed char,unsigned char占据存储相同量的并具有相同的对准要求(3.11); 也就是说,它们具有相同的对象表示.对于字符类型,对象表示的所有位都参与值表示.

对于无符号字符类型,值表示的所有可能位模式表示数字.这些要求不适用于其他类型.

在任何特定实现中,普通char对象可以采用与a signed charunsigned char;实现定义的值相同的值.

3.9p2 类型 [basic.types]

对于平凡可复制类型的任何对象(基类子对象除外),T,无论对象是否包含有效的类型值,构成对象T的基础字节(1.7)都可以复制到数组charunsigned char.

如果阵列的内容charunsigned char将被复制回对象,该对象随后应保持其原始值.

c++ language-lawyer c++11 c++14

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

是否可以为枚举类枚举器添加别名?

给定一个C++ 11枚举类,嵌套在几个长而丑陋的命名空间中:

namespace
    long_and_ugly
{
    enum class
        colour
    {
        red,
        green,
        blue
    };
}
Run Code Online (Sandbox Code Playgroud)

别名是否可以由枚举值组成?使用clang ++ 3.5,可以执行以下操作:

using long_and_ugly::colour; // take all the values into the current namespace
using long_and_ugly::colour::red; // take only 'red' into the current namespace

function_taking_colour_argument( red ); // instead of fully referring to the value
Run Code Online (Sandbox Code Playgroud)

然而,g ++ 4.9抱怨道.我无法复制其错误消息,因为我无法访问代码,但它明确抱怨使用using指令或声明.我也试过这个:

using red = long_and_ugly::colour::red;
Run Code Online (Sandbox Code Playgroud)

但它也失败了.对不要粘贴错误我很抱歉.不过,我相信你应该能够重现它.


问题(S)

  • 是否可以在标准C++ 11中为枚举值声明别名,或者我是否使用了clang扩展?

  • 如果是,那么正确的语法是什么?

c++ enums alias language-lawyer c++11

23
推荐指数
2
解决办法
6928
查看次数

缩小转换和初始化列表,哪个编译器是正确的?

考虑以下代码:

#include <iostream>

auto main() -> int {
  double x(7.0);
  int i{x};
  std::cout << "i = " << x << std::endl;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)
  • 在GCC4.9中编译时,只有一个警告编译好:

    warning: narrowing conversion of ‘x’ from ‘double’ to ‘int’ inside { }


  • 使用Clang3.3或VC++ 2013进行编译会产生编译错误:

    error: type 'double' cannot be narrowed to 'int' in initializer list error C2397: conversion from 'double' to 'int' requires a narrowing


问题:

  • 根据标准,哪个编译器是正确的?

  • 上面提到的编译器是否应该表现出这种多样化的行为?

c++ gcc clang visual-c++ c++11

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

在C++ 11中,如何指定隐含的"this"参数"[[carry_dependency]]"?

[dcl.attr.depend]/1中,我读到:

属性[...] carries_dependency[...]可以被应用到declarator-idparameter-declaration在函数声明或λ,在这种情况下,它SPECI音响上课该参数的初始化携带依赖性(1.10)的每个左值到右值该对象的转换(4.1).该属性也可以应用于declarator-id函数声明,在这种情况下,它指定返回值(如果有的话)对函数调用表达式的求值具有依赖性.

我缺少的是一种将属性应用于隐式this参数的方法.

举例来说,考虑这个免费功能:

void fun(int i, Foo * [[carries_dependency]] f);
Run Code Online (Sandbox Code Playgroud)

它等同于(但对于属性)成员版本:

void Foo::fun(int i); // can't add [[carries_dependency]] here?
Run Code Online (Sandbox Code Playgroud)

c++ member-functions c++11 carries-dependency

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

调用函数指针时,星号是否可选?

我无法在任何地方找到答案.我刚读了K&R,看到他们调用这样的函数指针:

(*ptr)(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

然而,我清楚地记得看到有人像这样使用它们:

ptr(arg1, arg2);
Run Code Online (Sandbox Code Playgroud)

但这可能是在C++中.

  • 规则怎么样?
  • 它们在C和C++上有区别吗?

c c++ function-pointers language-lawyer

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

将unsigned char*强制转换为char*是否安全,并将解除引用的指针视为真正指向char?

在标题为由于错误的strcmp参数处理而生成的警告之后,似乎存在一些关于标准实际上保证关于字符类型的值表示的问题.


问题

这看起来很好,但标准是否保证(1)总是会产生真实的

char unsigned * p1 = ...;
char          * p2 = reinterpret_cast<char *> (p1);

*p1 == *p2; // (1)
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer c++11 c++14

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

std :: pair构造函数接口

这实际上是关于界面设计的一般性问题,但我更容易以std::pair一个例子为例:

template <class T1, class T2>
struct pair {
    ...
    pair(const T1& x, const T2& y);
    template<class U, class V> pair(U&& x, V&& y);
    ...
};
Run Code Online (Sandbox Code Playgroud)

所以我们可以看到有两个重载都需要2个参数来初始化该对的2个成员.我的问题是,提供第一个有什么好处,而第二个可用?是否有任何类型的参数只能传递给第一个而不是第二个?

(让我们暂时搁置标准库的向后兼容性考虑,并讨论接口设计作为一般性问题.)

c++ language-lawyer c++11

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

ifstream :: is_open vs ifstream :: fail?

读Savitch的问题在C++中求解,std::ifstream::fail被示出作为一个例子,以检查是否一个文件已被正确地打开(ifstreamofstream).

我之前使用过,就像我第一次看到的那样,std::ifstream::is_open执行相同的检查.

哪个'更好'的做法?

或者在尝试打开后直接调用任何一个的情况下,它是否没有实际区别?

c++ ifstream

16
推荐指数
2
解决办法
9351
查看次数

std :: move_if_noexcept调用copy-assignment,即使move-assignment是noexcept; 为什么?

我试图尽可能接近强异常保证,但在玩的时候std::move_if_noexcept我遇到了一些看似奇怪的行为.

尽管在布展赋值运算符在下面的类标记noexcept,该拷贝赋值运算符时与有关函数的返回值调用被调用.

struct A {
  A ()         { /* ... */ }
  A (A const&) { /* ... */ }

  A& operator= (A const&) noexcept { log ("copy-assign"); return *this; }
  A& operator= (A&&)      noexcept { log ("move-assign"); return *this; }

  static void log (char const * msg) {
    std::cerr << msg << "\n";
  }
};
Run Code Online (Sandbox Code Playgroud)
int main () {
  A x, y;

  x = std::move_if_noexcept (y); // prints "copy-assign" …
Run Code Online (Sandbox Code Playgroud)

c++ c++14

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

为什么我不能用`fstream`的实例初始化对`ofstream` /`ifstream`的引用?

介绍

void  read_foo (std::ifstream& out);
void write_foo (std::ofstream& out);
Run Code Online (Sandbox Code Playgroud)

我有这两个函数,其中一个应该从一个文件读取,另一个应该写入一个.

一切都有下面的片段;

std::ifstream ifs ("filename.txt");
read_foo  (ifs);
Run Code Online (Sandbox Code Playgroud)

std::ofstream ofs ("filename.txt");
write_foo (ofs);
Run Code Online (Sandbox Code Playgroud)

问题

但是,如果我尝试使用a std::fstream,那么我可以使用相同的流调用这两个函数,它不会编译,并且编译器会发出大量错误消息.

  • 为什么我不能绑定fstreamifstream&,或ofstream&

Foo.cpp中

#include <fstream>

void  read_foo (std::ifstream& out);
void write_foo (std::ofstream& out);

int main () {
  std::fstream fs ("filename.txt");

   read_foo (fs);
  write_foo (fs);
}
Run Code Online (Sandbox Code Playgroud)

错误(S):


foo.cpp: In function ‘int main()’:
foo.cpp:9:16: error: invalid initialization of reference of type ‘std::ifstream& {aka std::basic_ifstream<char>&}’ from expression of type ‘std::fstream {aka std::basic_fstream<char>}’ read_foo …

c++ fstream reference ifstream ostream

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