小编Kev*_*vin的帖子

使用lambda(C++)创建的std :: function的奇数返回行为

如果函数返回一个引用但返回类型没有明确地作为引用调用,那么我在使用lambdas创建的std :: functions时遇到问题.似乎std :: function被创建没有警告,但是在调用它时,在预期引用时返回一个值,导致事情爆炸.这是一个非常人为的例子:

#include <iostream>
#include <vector>
#include <functional>

int main(){
   std::vector<int> v;
   v.push_back(123);
   std::function<const std::vector<int>&(const std::vector<int>&)> callback =
      [](const std::vector<int> &in){return in;};
   std::cout << callback(v).at(0) << std::endl;
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

这会打印出垃圾,但是如果修改lambda以显式返回一个const引用,它就可以正常工作.我可以理解编译器认为lambda是没有提示的值返回值(当我最初遇到这个问题时,lambda直接从返回const引用的函数返回结果,在这种情况下我会认为lambda的const引用返回是可以推导的,但显然不是.)令我惊讶的是,编译器允许std :: function由具有不匹配返回类型的lambda构造.这种行为有望吗?我是否遗漏了标准中允许发生这种不匹配的内容?我用g ++(GCC)4.8.2看到这个,没有尝试过其他任何东西.

谢谢!

c++ lambda g++ c++11 std-function

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

模板成员函数专业化也可以是实例化吗?

我遇到了模板专业化的问题.以下构建和运行,但我不确定它应该:

// template.h
template <typename T>
class interface{
public:
   void doSomething();
};

// template.cpp
#include "template.h"
#include <iostream>
template <> void interface<int>::doSomething(){std::cout << "Did something\n";}

// main.cpp
#include "template.h"
int main(){
   interface<int> instance;
   instance.doSomething();
   return 0;
 };

g++ main.cpp template.cpp; ./a.out
Run Code Online (Sandbox Code Playgroud)

我的理解是所有编译单元都应该可以访问所有模板特化,而main.cpp则没有.如果我理解正确发生的事情,template.cpp中的特化也会实例化interface <int>,因此生成符号并且所有内容都很愉快地链接.但是,我很确定这属于不确定性的范畴,我不能指望它始终在任何地方工作.有人可以确认或否认我的怀疑吗?

谢谢!

c++ templates template-specialization

6
推荐指数
0
解决办法
191
查看次数

sleep_until 过去的某个时间点

我有一个我认为是简单的模式 - 我想在未来 5 秒创建一个时间点,运行一个可能需要一段时间的任务,然后睡眠直到该时间点(如果已经达到该时间,则可能根本不睡眠.)但是,每当尝试使用std::this_thread::sleep_until过去的时间点时,我的应用程序就会永远挂起。这是一个 MCVE:

#include <chrono>
#include <thread>

int main(){
  std::this_thread::sleep_until(std::chrono::steady_clock::now() - std::chrono::seconds(1));
}
Run Code Online (Sandbox Code Playgroud)

使用 g++ (GCC) 4.8.5,这永远不会返回。我也尝试过 system_clock ,结果相同。使用 strace 检查发生了什么,我得到的最后一件事是:

nanosleep({4294967295, 0},
Run Code Online (Sandbox Code Playgroud)

所以我想它最终会回来,但我不想等那么久。

这是一个 g++ 错误吗?我无法想象这种行为是故意的。我发现问题是指定过去的时间点时行为是否明确定义?sleep_until()但对于该标准是否确实指定了应该发生的事情,似乎并没有真正得出任何结论。此后我对我的问题实施了另一种解决方案;我只是好奇我所看到的是 UB 还是 bug。

c++ multithreading c++-chrono

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

GCC更新后意外的CONSTRAINT_ERROR

我们最近更新了GCC版本(4.8.2到5.3.0),并开始在某些Ada应用程序中收到意外的约束错误.我把它减少到以下几点:

-- moo.adb
with text_io;
procedure moo is
   type thing_type is (something1,something2,something3,something4,something5,something6);
   for thing_type use (something1 => 1,something2 => 2,something3 => 
      3,something4 => 4,something5 => 5,something6 => 6);
   for thing_type'size use 32;
   type thing_array_t is array (0 .. 5) of thing_type;
   thing_array : thing_array_t := (others => something1);
begin
   text_io.put_line("item 0 = " & thing_type'image(thing_array(0)));
end moo;
Run Code Online (Sandbox Code Playgroud)

这个程序将在GCC版本上编译得很好(只需使用"gnatmake moo.adb"编译).使用4.8.2构建时,输出符合预期:

item 0 = SOMETHING1
Run Code Online (Sandbox Code Playgroud)

使用5.0.3构建时,我们会收到

raised CONSTRAINT_ERROR : moo.adb:13 invalid data
Run Code Online (Sandbox Code Playgroud)

有趣的是,编译为32位和64位时结果完全相同.可以使用5.3.0更改许多内容以使程序正常工作:删除thing_type'size子句,向枚举器添加或删除值,更改数组中的项数,使用不同的值初始化数组等这段代码有没有明显的问题可以解释这种行为?

gcc ada gnat

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

使用[]运算符时的“类型的绑定引用丢弃限定符”

我在C ++应用程序中使用C样式的数组(需要与C代码进行接口),但是在数组上使用[]运算符时,却遇到了“类型丢弃限定符的绑定引用”。这是一个小例子:

#include <iostream>
struct outer_struct {
  struct {
    int i;
  } array[1];
} temp_struct;

typedef decltype( static_cast<outer_struct*>(nullptr)->array[0]  ) typed;

void do_something_2(const typed &thing)
{
  std::cout << thing.i << std::endl;
}

void do_something_1(const outer_struct &thing)
{
  // error: binding reference of type ‘outer_struct::<unnamed struct>&’ to
  // ‘const outer_struct::<unnamed struct>’ discards qualifiers
  do_something_2(thing.array[0]);
}

int main()
{
  temp_struct.array[0].i = 2;
  do_something_1(temp_struct);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我本以为在const引用上使用[]运算符会返回const引用,但是从编译器输出来看,似乎并非如此。将do_something_1的签名更改为

void do_something_1(outer_struct &thing)
Run Code Online (Sandbox Code Playgroud)

解决错误。我通常在const正确性方面没有问题,但是老实说我无法弄清楚我在做什么错。任何帮助表示赞赏。

我正在使用g ++ 7.3.0。我也尝试过旧版本的GCC。

c++ arrays const

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