Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt并发代码是否具有未定义的行为?_C++_Qt - Fatal编程技术网

C++ Qt并发代码是否具有未定义的行为?

C++ Qt并发代码是否具有未定义的行为?,c++,qt,C++,Qt,如果您编写如下内容:QFuture thread_res=QtConcurrent::run([](){})引擎下有模板魔术,问题是C++的有效代码。 QtPrivate::ResultStore<T> &resultStore() { return static_cast<QtPrivate::ResultStore<T> &>(resultStoreBase()); } 1) 模板类QFutureInterface具有方法 QtPriva

如果您编写如下内容:
QFuture thread_res=QtConcurrent::run([](){})引擎下有模板魔术,问题是C++的有效代码。
QtPrivate::ResultStore<T> &resultStore()
{ return static_cast<QtPrivate::ResultStore<T> &>(resultStoreBase()); }
1)
模板类QFutureInterface
具有方法

QtPrivate::ResultStore<T> &resultStore()
{ return static_cast<QtPrivate::ResultStore<T> &>(resultStoreBase()); }
派生的模板类
没有数据,
foo.f()
仅用于调用方法,而不是复制对象或销毁对象,因此唯一可以通过
vptr
调用的方法-析构函数从未通过此类接口调用

QtPrivate::ResultStore<T> &resultStore()
{ return static_cast<QtPrivate::ResultStore<T> &>(resultStoreBase()); }
所以问题是这个代码有未定义的行为

QtPrivate::ResultStore<T> &resultStore()
{ return static_cast<QtPrivate::ResultStore<T> &>(resultStoreBase()); }

根据这一点,这样的代码有任何未定义的行为,但为什么Qt的家伙会以这种方式编写呢?

原因是务实的:并不是所有的行为在实践中都是未定义的。它可以由实现定义,在本例中是。因此,是的,根据标准,代码具有未定义的行为,但您运行的不是抽象的编译器概念,而是真正的软件,其开发人员已决定定义行为。请记住,未定义的行为是最低限度的保证,任何实现都可以符合标准,并用实现定义的行为替换未定义的行为!但是任何使用QtConcurent崩溃的代码如果使用
-fsanize=address,undefined
编译,你不能随便删除它,而不说编译器是什么编译器,什么平台,什么二进制包,一旦你这么做了,它就不属于这里,但在一个bug追踪器中——很可能是Qt的。我认为这个问题是在寻求帮助理解代码,因此我认为这是一个有效的问题,即使答案是“这是一个bug,不要自己做”。不过,链接到完整的原始源代码以及用于崩溃的编译器还是不错的…@KubaOber
你不能随便删除
你是说崩溃时
-fsanize=address,未定义的
?这发生在每一个支持clang/gcc/sanitalizer的平台(linux+amd64、x86、arm、arm64等等)上,因为santizier认为静态转换是从基本行为转换为派生的未定义行为。因此,在去bugzilla之前,我需要决定谁是bugzilla负责Qt,或者可能是clang/gcc/Sanitizer。原因是务实的:并非所有行为在实践中都是未定义的。它可以由实现定义,在本例中是。因此,是的,根据标准,代码具有未定义的行为,但您运行的不是抽象的编译器概念,而是真正的软件,其开发人员已决定定义行为。请记住,未定义的行为是最低限度的保证,任何实现都可以符合标准,并用实现定义的行为替换未定义的行为!但是任何使用QtConcurent崩溃的代码如果使用
-fsanize=address,undefined
编译,你不能随便删除它,而不说编译器是什么编译器,什么平台,什么二进制包,一旦你这么做了,它就不属于这里,但在一个bug追踪器中——很可能是Qt的。我认为这个问题是在寻求帮助理解代码,因此我认为这是一个有效的问题,即使答案是“这是一个bug,不要自己做”。不过,链接到完整的原始源代码以及用于崩溃的编译器还是不错的…@KubaOber
你不能随便删除
你是说崩溃时
-fsanize=address,未定义的
?这发生在每一个支持clang/gcc/sanitalizer的平台(linux+amd64、x86、arm、arm64等等)上,因为santizier认为静态转换是从基本行为转换为派生的未定义行为。所以在去bugzilla之前,我需要决定谁是bugzilla负责Qt,或者可能是clang/gcc/消毒剂
QtPrivate::ResultStore<T> &resultStore()
{ return static_cast<QtPrivate::ResultStore<T> &>(resultStoreBase()); }