小编Rud*_*lis的帖子

这是一个铿锵的bug还是我不了解的关于C++的东西?

在看这个问题时,我用铿锵声试了一下,陷入了一种奇怪的境地.以下示例:

#include <string>

class ACP
{
public:
    ACP() {}
    operator const std::string() const  { return std::string(); }
    // operator std::string() const  { return std::string(); } <-- makes clang happy
};

void test()
{
   const ACP acp;
   auto a = (std::string)acp;
}
Run Code Online (Sandbox Code Playgroud)

使用gcc 在coliru上编译好,但是没有使用clang.至少我看到这个例子没有问题 - 这是clang中的错误还是有一个规则实际上解释了clang错误和gcc是错误的?

clang的错误如下:

clang -std=c++14 -O2 -Wall -pedantic -pthread main.cpp && ./a.out
main.cpp:13:26: error: no viable conversion from 'const ACP' to 'std::__cxx11::basic_string<char>'
   auto a = (std::string)acp;
                         ^~~
/usr/local/bin/../lib/gcc/x86_64-pc-linux-gnu/7.1.0/../../../../include/c++/7.1.0/bits/basic_string.h:421:7: note: candidate constructor not viable: …
Run Code Online (Sandbox Code Playgroud)

c++ gcc clang language-lawyer

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

编译不应抛出但仍然可以执行的函数的时间检测(noexcept或替代方法)

我知道noexcept只是提供信息,gcc/clang不会触发此代码段的任何警告/错误:

void foo() noexcept
{
  throw 1;
}

int main()
{
  foo();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

那么 - 是否有一种方法或技术来标记一个函数不抛出任何东西,如果实现抛出,实际上从编译器获得编译时警告/错误?

一个简单的用例 - 我有一个框架,它公开了客户端插件应该实现的一组接口,然后框架从共享对象加载插件,通过工厂实例化接口并调用接口方法.我希望在调用期间不会在库边界上抛出任何异常,因此我想将插件实现的接口中的所有函数标记为不抛出,而不是依赖于内部具有try/ catchblock 的实现.有没有相关的常用技术/替代解决方案?

我也明白,没有编译时间检查可以检测在运行时由于数据无效而可能发生的潜在结构化异常,但是有什么东西适用于至少C++异常吗?

编辑

感谢Jason的评论,我检查了函数指针发生了什么,并且还有点让人失望 - 至少在下面的代码段中抱怨,gcc没有:

void foo() noexcept
{
  throw 1;
}

void bar() noexcept(false)
{
}

int main()
{
  void (*safe_function_one)() noexcept  = &foo;  
  void (*safe_function_two)() noexcept  = &bar;  
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ exception-handling

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

gcc 4.9.2和gcc 5.3之间正则表达式支持的差异

任何更熟悉gcc的人都可以指出为什么下面的样本在gcc 4.9.2上无法匹配但在gcc 5.3上成功了吗?有什么我可以做的来交替模式,以便它可以工作(似乎在VS 2013上工作正常)?

#include <iostream>
#include <regex>

std::regex pattern("HTTP/(\\d\\.\\d)\\s(\\d{3})\\s(.*)\\r\\n(([!#\\$%&\\*\\+\\-\\./a-zA-Z\\^_`\\|-]+\\:[^\\r]+\\r\\n)*)\\r\\n");

const char* test = "HTTP/1.1 200 OK\r\nHost: 192.168.1.72:8080\r\nContent-Length: 86\r\n\r\n";

int main()
{
    std::cmatch results;
    bool matched = std::regex_search(test, test + strlen(test), results, pattern);
    std::cout << matched;
    return 0; 
}
Run Code Online (Sandbox Code Playgroud)

我假设我使用的是gcc 4.9.2中不支持但稍后添加或修复的内容,但我不知道在哪里查找它.

UPDATE

由于大量的帮助和建议,我试图回溯问题而不是仅仅切换到gcc 5.我得到了正确的匹配修改:

#include <iostream>
#include <regex>

std::regex pattern("HTTP/(\\d\\.\\d)\\s(\\d{3})\\s(.*?)\\r\\n(?:([^:]+\\:[^\\r]+\\r\\n)*)\\r\\n");

const char* test = "HTTP/1.1 200 OK\r\nHost: 192.168.1.72:8080\r\nContent-Length: 86\r\n\r\n";

int main()
{
    std::cmatch results;
    bool matched = std::regex_search(test, test + strlen(test), results, pattern);
    std::cout << matched << std::endl;
    if (matched) …
Run Code Online (Sandbox Code Playgroud)

c++ regex gcc

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

C++标准是否为编译器指定了STL实现细节?

在写这个问题的答案时,我遇到了一个有趣的情况 - 这个问题演示了一个人想要将一个类放在STL容器中但由于缺少复制构造函数/移动构造函数/赋值运算符而无法执行此操作的情况.在这种特殊情况下,错误由触发std::vector::resize.我做了一个快速片段作为解决方案,并看到另一个答案,提供了一个移动构造函数,而不是像我一样提供赋值运算符和复制构造函数.什么是有趣的,另一个答案没有在VS 2012中编译,而clang/gcc对这两种方法都很满意.

第一:

// Clang and gcc are happy with this one, VS 2012 is not
#include <memory>
#include <vector>

class FooImpl {};

class Foo
{
    std::unique_ptr<FooImpl> myImpl;
public:
    Foo( Foo&& f ) : myImpl( std::move( f.myImpl ) ) {}
    Foo(){}
    ~Foo(){}
};

int main() {
    std::vector<Foo> testVec;
    testVec.resize(10);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

第二:

// Clang/gcc/VS2012 are all happy with this
#include <memory>
#include <vector>

using namespace std;
class FooImpl {};

class Foo
{
    unique_ptr<FooImpl> …
Run Code Online (Sandbox Code Playgroud)

c++ gcc stl clang visual-c++

10
推荐指数
2
解决办法
4762
查看次数

通过Tizen IDE或sdb连接到Tizen TV

我认为专门讨论Tizen的三星论坛将是解决这个问题的第一个地方,但在阅读完它们之后,似乎没有人能够成功实现这一点并且支持也没有提供任何有价值的信息,所以我只希望有一些SO使用Tizen电视的用户已经遇到过并且可能已经解决了这个问题.

我正在尝试从Tizen IDE连接到Tizen智能电视以部署本机应用程序.据我所知,此功能非常新,仅在最近的固件版本中受支持.我已经更新到最新的固件(1411),但仍然没有Tizen IDE(即连接资源管理器组件)本机sdb命令行工具似乎都没有工作(我在这篇文章中详细描述了三星Tizen论坛的行为) ).

sdb除了以外的任何命令,该工具似乎失败了sdb connect.连接似乎成功但在此之后任何其他命令,如sdb dlogsdb shell只是打印连接已关闭.Wireshark也批准了这一点 - 每条TCP消息都得到CLSE回复.

SO上是否有人通过Tizen智能电视上的开发者模式成功部署了本机应用程序并可以共享配方?

connection tizen tizen-sdb tizen-native-app tizen-sdk

10
推荐指数
2
解决办法
5991
查看次数

是constexpr函数,可以在C++中加载文件吗?

这里有一个类似的问题,但它没有有价值的信息,所以我想再问一遍 - 是否可以使用constexpr函数加载任意文件的内容?我知道这似乎是不可能的,因为在这种情况下无法调用允许文件I/O(fopen,open...)的所有可能的函数constexpr.但是 - 由于这里有许多人关注c ++ 17的开发并且正在进行 - 是否有希望进一步的标准将包含一些文件I/O API,它们将constexpr在编译时用于加载文件?

仅仅为了比较--Haxe允许通过编译时宏执行几乎任何操作,因此在C++中使用类似的东西会非常酷.例如,通过反序列化文件生成类实例.

c++ constexpr

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

一个设备的多个CUDA上下文 - 任何意义上的?

我以为我已经掌握了这一点,但显然我没有:)我需要使用不是编码器接受的任何格式的帧执行NVENC的并行H.264流编码,因此我有以下代码管道:

  • 调用通知新帧已到达的回调
  • 我将帧复制到CUDA内存并执行所需的颜色空间转换(只有第一个cuMemcpy是同步的,所以我可以从回调中返回,所有挂起的操作都在专用流中推送)
  • 我将一个事件推送到流上并让另一个线程等待它,一旦设置它我将CUDA内存指针与帧在正确的颜色空间中并将其提供给解码器

出于某种原因,如果我在并行线程中执行此管道,我假设我需要为每个线程提供专用上下文.代码很慢,经过一些阅读我明白上下文切换实际上是昂贵的,然后我实际上得出的结论是没有意义,因为在一个上下文中拥有整个GPU所以我锁定了来自其他代码转换器线程的任何并行处理.

问题1:在这种情况下,我是否善于使用单个上下文和在此上下文中为执行上述管道的每个线程创建的显式流?

问题2:有人可以告诉我CUDA设备上下文的唯一目的是什么?我认为它在多GPU场景中是有意义的,但是在任何情况下我都想为一个GPU创建多个上下文吗?

c++ cuda video-encoding

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

强制 C# 加载仅在 cshtml 文件中引用的程序集

如何强制 C# 运行时加载仅在.cshtml作为 Razor 模板的文件中使用的程序集?

我正在使用 JSON 序列化功能Newtonsoft,项目引用了程序集,但是当 Razor 引擎编译模板时,我收到一个错误,指出Newtonsoft命名空间未知。我还看到 dll 实际上没有加载(我想这是有道理的,因为它没有在 C# 代码中的任何地方引用)。如果我在我的 C# 代码中的某处添加一个虚拟行来引用它加载的程序集中的任何函数,并且 Razor 很高兴。有没有办法指定即使没有引用程序集也应该加载它?我真的不想在代码中留下虚拟行。

c# visual-studio-2010 razorengine

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

使用多个线程处理SIGTERM的正确方法

我在Raspberry上有一个多线程程序,我想在其中处理SIGTERM并优雅地关闭所有内容.问题是我有一个后台线程调用recvfrom()了阻塞套接字.根据我对man手册的理解,如果我退出我的处理程序,所有系统调用都应该被唤醒并返回-1并errno设置为EINTR.但是在我的情况下,recvfrom电话一直挂着.

1)总的来说,我理解这一点,在这种情况下,所有能够被信号唤醒的阻塞系统调用的线程都应该被唤醒?2)操作系统是否在我的thead上设置了一些特殊的信号掩码?

有趣的部分是我使用VideoCore原语,而不是pthread,也许这可能是原因?这是一个小测试示例:

#include <iostream>

#include <cstdlib>
#include <cstring>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <signal.h>


#include "interface/vcos/vcos.h"

void SignalHandler(int nSignalNumber)
{
    std::cout << "received signal " << nSignalNumber << std::endl;
}

void* ThreadMain(void* pArgument)
{
    int nSocket = socket(AF_INET, SOCK_DGRAM, 0);
    if (nSocket >= 0)
    {
        sockaddr_in LocalAddress;
        memset(&LocalAddress, 0, sizeof(LocalAddress));
        LocalAddress.sin_family = AF_INET;
        LocalAddress.sin_addr.s_addr = INADDR_ANY;
        LocalAddress.sin_port = htons(1234);
        if (bind(nSocket, reinterpret_cast<sockaddr *>(&LocalAddress), sizeof(LocalAddress)) == …
Run Code Online (Sandbox Code Playgroud)

c++ multithreading posix raspbian

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

__STDC_LIB_EXT1__在gcc和clang中的可用性

由于快速的Google搜索未找到任何内容,因此我将尝试在此处询问(由于涉及gcc / clang的许多人都在这里闲逛)__STDC_LIB_EXT1__-gcc / clang 的状态是什么?我们正在开发一个跨平台应用程序,我想使用其中的一些安全范围检查功能<stdio.h>(奇迹般的功能在Visual Studio 2017中可用),但是无法使用Xcode 9.2编译代码。我认为也许Xcode使用的Clang版本已经过时,但是Ubuntu上的gcc 6.3.0的行为相同。我正在尝试将tmpnam_s与以下示例一起使用:

#if defined(__STDC_LIB_EXT1__)
#define  __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#else
#error "__STDC_LIB_EXT1__ not defined"
#endif

int main(int argc, char** argv)
{
    char t[L_tmpnam_s]; 
    tmpnam_s(t, L_tmpnam_s);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但是编译失败,未定义宏:

gcc -std=c11 test.c
test.c:5:2: error: #error "__STDC_LIB_EXT1__ not defined"
#error "__STDC_LIB_EXT1__ not defined"
^~~~~
Run Code Online (Sandbox Code Playgroud)

我是在做错什么,还是对此功能集的支持很差?

c gcc clang tr24731 c11

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