小编bol*_*lov的帖子

站点编码字节上的“ gets(stdin)”怎么回事?

Coderbyte是一个在线编码挑战网站(我在2分钟前找到了它)。

遇到的第一个C ++挑战有一个您需要修改的C ++框架:

#include <iostream>
#include <string>
using namespace std;

int FirstFactorial(int num) {

  // Code goes here
  return num;

}

int main() {

  // Keep this function call here
  cout << FirstFactorial(gets(stdin));
  return 0;

}
Run Code Online (Sandbox Code Playgroud)

如果你稍微熟悉C ++的第一件事*在你的眼睛持久性有机污染物是:

int FirstFactorial(int num);
cout << FirstFactorial(gets(stdin));
Run Code Online (Sandbox Code Playgroud)

因此,好的,代码调用gets从C ++ 11开始不推荐使用,而从C ++ 14开始删除,这本身就是不好的。

但后来我意识到:gets是类型char*(char*)。因此,它不应该接受FILE*参数,并且结果不能代替int参数使用,但是...不仅可以编译时没有任何警告或错误,而且可以运行并将实际的正确输入值传递给FirstFactorial

在此特定站点之外,代码无法编译(如预期的那样),那么这里发生了什么?


*实际上第一个是,using namespace std但这与我在这里的问题无关。

c++ gets input standards-compliance

144
推荐指数
3
解决办法
7159
查看次数

std :: tie是如何工作的?

我已经习惯了,std::tie没有多考虑它.它有效,所以我接受了:

auto test()
{
   int a, b;
   std::tie(a, b) = std::make_tuple(2, 3);
   // a is now 2, b is now 3
   return a + b; // 5
}
Run Code Online (Sandbox Code Playgroud)

但这个黑魔法是如何运作的呢?如何做一个临时的创建std::tie改变ab?我发现这更有趣,因为它是一个库功能,而不是语言功能,所以我们可以自己实现并理解它.

c++ tuples c++11

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

这个结构如何具有sizeof == 0?

有一个旧帖子要求一个sizeof可以返回的构造0.高信誉用户有一些高分答案说,按标准,没有类型或变量可以有0的大小.我同意100%.

然而,这个新的答案提出了这个解决方案:

struct ZeroMemory {
    int *a[0];
};
Run Code Online (Sandbox Code Playgroud)

我正要进行投票和评论,但是在这里度过的时间教会我检查我100%肯定的事情.所以...让我惊讶的是,gccclang显示出相同的结果:sizeof(ZeroMemory) == 0.更重要的是,变量的大小是0:

ZeroMemory z{};
static_assert(sizeof(z) == 0); // Awkward...
Run Code Online (Sandbox Code Playgroud)

Whaaaat ...?

Godbolt链接

这怎么可能?

c++ sizeof language-lawyer

78
推荐指数
4
解决办法
5114
查看次数

数组类型和使用malloc分配的数组之间的区别

今天我用一些C代码帮助我的一个朋友,我发现了一些奇怪的行为,我无法解释他为什么会发生这种行为.我们有一个带有整数列表的TSV文件,每行都有一个int.第一行是列表的行数.

我们还有一个非常简单的"readfile"的ac文件.第一行读到n,行数,然后有一个初始化:

int list[n]
Run Code Online (Sandbox Code Playgroud)

最后是一个带有fscanf的n循环.

对于小n(直到~100,000),一切都很好.但是,我们发现当n很大(10 ^ 6)时,会发生段错误.

最后,我们将列表初始化更改为

int *list = malloc(n*sizeof(int))
Run Code Online (Sandbox Code Playgroud)

一切都很好,即使是非常大的n.

有人能解释为什么会这样吗?什么导致了segfault [n]的段错误,当我们开始使用list = malloc(n*sizeof(int))时停止了?

c arrays malloc variable-length-array

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

删除了默认构造函数.仍然可以创建对象......有时候

c ++ 11统一初始化语法的天真,乐观和哦......错误的观点

我认为,因为C++ 11用户定义的类型对象应该使用新{...}语法而不是旧(...)语法构造(除了构造函数重载std::initializer_list和类似参数(例如std::vector:size ctor vs 1 elem init_list ctor)).

好处是:没有狭义的隐式转换,最烦人的解析没有问题,一致性(?).我没有看到任何问题,因为我认为它们是相同的(除了给出的例子).

但他们不是.

一个纯粹疯狂的故事

{}调用默认的构造函数.

......除非:

  • 删除默认构造函数
  • 没有定义其他构造函数.

然后它看起来像是值而不是初始化对象?...即使对象已经删除了默认构造函数,{}也可以创建一个对象.这不是打败了删除的构造函数的全部目的吗?

......除非:

  • 该对象有一个删除的默认构造函数和
  • 其他构造函数定义.

然后失败了call to deleted constructor.

......除非:

  • 该对象有一个删除的构造函数和
  • 没有其他构造函数定义和
  • 至少是一个非静态数据成员.

然后失败并丢失了字段初始值设定项.

但是,您可以使用它{value}来构造对象.

好吧也许这与第一个异常相同(值init对象)

......除非:

  • 该类有一个删除的构造函数
  • 并且至少有一个数据成员默认初始化.

然后也{}不能{value}创建一个对象.

我相信我错过了一些.具有讽刺意味的是,它被称为统一初始化语法.我再说一遍:UNIFORM初始化语法.

这种疯狂是什么?

情景A.

删除默认构造函数:

struct foo {
  foo() = delete;
};

// All bellow OK (no errors, no warnings) …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer aggregate-initialization list-initialization c++14

49
推荐指数
3
解决办法
6977
查看次数

限制可变参数模板参数

我们可以将可变参数模板参数限制为某种类型吗?即,实现类似的东西(当然不是真正的C++):

struct X {};

auto foo(X... args)
Run Code Online (Sandbox Code Playgroud)

在这里,我的目的是拥有一个接受可变数量X参数的函数.

我们最接近的是:

template <class... Args>
auto foo(Args... args)
Run Code Online (Sandbox Code Playgroud)

但是这接受任何类型的参数.

c++ templates c++-faq variadic-templates c++17

41
推荐指数
2
解决办法
3740
查看次数

别名模板的包扩展

似乎只能在别名模板的pack参数的位置扩展pack参数.对于类或函数模板,情况并非如此:

template <class T, class... Args> struct x { using type = T; };

template <class T, class... Args> using x_t     = typename x<T, Args...>::type;
template <class... Args>          using x_fix_t = typename x<Args...>::type;

template <class... Args> auto f(Args...) -> void {
  typename x<Args...>::type v1; // OK
  x_t<Args...> v2; // Error
  x_fix_t<Args...> v3; // OK
}
Run Code Online (Sandbox Code Playgroud)

更简单的情况:

template <class T, class U> using y_t = T;

template <class... Args> auto f(Args...) -> void {
  y_t<Args...> v4; // Error
} …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer variadic-templates c++11 template-aliases

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

在布尔中设置额外的位可使其同时为真和为假

如果我得到一个bool变量并将其第二位设置为1,则变量同时评估为true和false。使用带有-g选项(gcc-v6.3.0/Linux/RHEL6.0-2016-x86_64/bin/g++ -g main.cpp -o mytest_d)的gcc6.3编译以下代码,然后运行可执行文件。您得到以下内容。

T如何同时等于真和假?

       value   bits 
       -----   ---- 
    T:   1     0001
after bit change
    T:   3     0011
T is true
T is false
Run Code Online (Sandbox Code Playgroud)

当您使用不同的语言(例如fortran)调用函数时,可能会发生这种情况,其中对和错的定义与C ++不同。对于fortran,如果任何位都不为0,则该值为true;如果所有位为零,则该值为false。

#include <iostream>
#include <bitset>

using namespace std;

void set_bits_to_1(void* val){
  char *x = static_cast<char *>(val);

  for (int i = 0; i<2; i++ ){
    *x |= (1UL << i);
  }
}

int main(int argc,char *argv[])
{

  bool T = 3;

  cout <<"       value   bits " <<endl;
  cout <<" …
Run Code Online (Sandbox Code Playgroud)

c++ evaluation boolean abi undefined-behavior

40
推荐指数
2
解决办法
4718
查看次数

这种模板语法是非法的吗?

我使用GCC 4.9.2得到了"内部编译器错误":

#include <type_traits>

template <typename T, typename, int, template <typename U, U, U> class>
struct Sort;

template <typename T, template <T...> class Z, T N, T... Is,
          template <typename U, U, U> class Comparator>
struct Sort<T, Z<N, Is...>, 0, Comparator> {
  template <T I>
  struct less_than : std::integral_constant<bool, Comparator<T, I, N>::value> {
  };
};

int main() {}
Run Code Online (Sandbox Code Playgroud)

错误消息指出:

c:\ ADandD> g ++ -std = c ++ 14 ComparatorAndSorterTGeneralized.cpp ComparatorAndSorterTGeneralized.cpp:254:80:内部编译器错误:在tsubst中,在cp/pt.c:11738

template<T I>
struct less_than : std::integral_constant<bool, Comparator<T,I,N>::value> {};
                                                                              ^
Run Code Online (Sandbox Code Playgroud)

如果合适,请提交完整的错误报告,并提供预处理的来源.有关说明,请参阅 …

c++ templates

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

什么是近,远和巨大的指针?

任何人都可以用适当的例子向我解释这些指针......当这些指针被使用时?

c c++ x86 pointers x86-16

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