小编and*_*ras的帖子

为什么std :: unique_ptr :: reset()总是noexcept?

最近的一个问题(特别是我对它的回答)让我想知道:

在C++ 11(和更新的标准)中noexcept,除非另有说明(即noexcept(false)),否则析构函数总是隐式的.在这种情况下,这些析构函数可能合法地抛出异常.(请注意,这仍然是你应该知道你在做什么 - 情况!)

但是,所有重载 std::unique_ptr<T>::reset()都被声明为noexcept(参见cppreference),即使析构函数T不是,如果析构函数在此期间抛出异常,也会导致程序终止reset().类似的事情适用于std::shared_ptr<T>::reset().

为什么reset()总是noexcept,而不是条件noexcept?

noexcept(noexcept(std::declval<T>().~T()))如果析构函数T是noexcept ,应该可以声明它使得它完全没有.我在这里遗漏了什么,或者这是标准中的疏忽(因为这无疑是一个高度学术化的情况)?

c++ destructor language-lawyer noexcept c++11

32
推荐指数
2
解决办法
2202
查看次数

使用命名空间的区别(std :: vs :: std::)

using ::std::...;
Run Code Online (Sandbox Code Playgroud)

VS

using std::...;
Run Code Online (Sandbox Code Playgroud)

有差异吗?如果是的话,哪一个?

我看到了这个:

using ::std::nullptr_t;
Run Code Online (Sandbox Code Playgroud)

这让我很好奇.

c++ scope namespaces using c++11

30
推荐指数
4
解决办法
3814
查看次数

lambdas的参数和返回值的类型转换规则是什么?

我最近惊讶于lambdas可以被分配给std::function具有略微不同签名的s .略有不同意味着当function指定返回时void,lambda的返回值可能会被忽略,或者参数可能是functionlambda 中的值但是引用.

请参阅此示例(ideone),其中我强调了我怀疑不兼容的内容.我认为返回值不是问题,因为你总是可以调用一个函数并忽略返回值,但是从引用到值的转换看起来很奇怪:

int main() {
    function<void(const int& i)> f;
    //       ^^^^ ^^^^^    ^
    f = [](int i) -> int { cout<<i<<endl; return i; };
    //     ^^^    ^^^^^^
    f(2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

小问题是:为什么这段代码编译和工作?主要问题是:与lambda参数和返回值一起使用时,类型转换的一般规则是什么std::function

c++ lambda type-conversion c++11

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

为什么"decltype(i + j)"的结果不是右值参考?

我试图给出一个导致rvalue的操作的简单示例.

这个测试用例应该有效,但令人惊讶的是(对我而言),添加两个ints 的结果不是rvalue(引用).我在这里错过了什么?

void test(int i, int j)
{
    // this assert should pass, but fails:
    static_assert(std::is_same<decltype(i + j), int&&>(), "i + j should be a rvalue"); 
    // this assert passed, but should fail:
    static_assert(std::is_same<decltype(i + j), int>(), "this assert should fail...");
}
Run Code Online (Sandbox Code Playgroud)

c++ rvalue decltype rvalue-reference c++11

17
推荐指数
2
解决办法
5292
查看次数

"声明会影响参数"是什么意思?

我试图创建一个函数,返回我将传递给它的整数的两倍.我的代码收到以下错误消息:

'int x'的声明会影响参数int x; "

这是我的代码:

#include <iostream>
int doublenumber();
using namespace std;
int doublenumber(int x)// <-- this is the function which returns double the value .
{
    int x;
    return 2 * x;
    cout << endl;
}
int main()
{
    int a;
    cout << "Enter the number that you want to double it : " << endl;
    cin >> a;
    doublenumber(a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ integer function

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

如何在QML中暂停最后一帧的视频?

我正在尝试停止QML视频,并在播放完成后显示其最后一帧.有人知道怎么做这个吗?(对不起,这似乎并不像听起来那么微不足道......)

目前,我的问题是视频元素在播放完成后变得不可见/隐藏.(onVisibleChanged从未被称为.)

当我onStatusChanged在我的代码中使用hack时,视频会在结束后消失一段时间,然后显示视频结束.

我正在做的只是:

Video {
    anchors.fill: parent
    fillMode: VideoOutput.PreserveAspectFit;
    source: "path/to/file"
    autoPlay: true

    onStatusChanged: {
        console.warn("StatusChanged:"+status+"|"+MediaPlayer.Loaded)
        if (status == MediaPlayer.EndOfMedia)
        {
        // seek a bit before the end of the video since the last frames
        // are the same here, anyway
            seek(metaData.duration-200)
            play()
            pause()
        }
    }
    onVisibleChanged:
    {
        console.log(visible)
    }
}
Run Code Online (Sandbox Code Playgroud)

我可能遗漏了一些东西,但我在文档中找不到关于这个主题的任何内容.另外,使用单独MediaPlayer并且VideoOutput不会改变行为.

为了记录,我在Windows上使用最新的Qt 5.2(msvc2010 + OpenGL-build).

video qt qml qt5

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

fetch_mult的这种原子实现是否正确?

该站点介绍了C ++ 11原子fetch_mult,并提供了默认std::atomic<T>类型未提供的原子操作的示例实现:

#include <atomic>
#include <iostream>

template <typename T>
T fetch_mult(std::atomic<T>& shared, T mult){
  T oldValue= shared.load();
  // 1
  while (!shared.compare_exchange_strong(oldValue, oldValue * mult));
  return oldValue;
}

int main(){
   std::atomic<int> myInt{5};
   std::cout << myInt << std::endl;          
   fetch_mult(myInt,5);
   std::cout << myInt << std::endl;         
}
Run Code Online (Sandbox Code Playgroud)

我在理解此功能时遇到麻烦。如果fetch_mult在点中断// 1另一个线程还呼吁fetch_mult,也不会一个线程死锁,因为compare_exchange_strong永远不会返回true,除非任何mult==1或者另一个线程组值回oldValue

例如(T1和T2是各自的线程):

  • T1: oldValue = 5;
  • T2: oldValue = 5;
  • T2:compare_exchange_strong成功将值设置为25
  • T1:compare_exchange_strong …

c++ thread-safety lock-free atomicity stdatomic

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

我可以安全地混合使用 -std=c++11 和 -std=c++14 编译的库吗?

从 C++98 和 C++11 过渡的早期开始,我记得在将 C++98 库和 C++11 库链接在一起时出现了一些与 ABI 相关的问题。(参见例如将不同的 C++ 标准与 GCC 混合以及该问题的答案。)

我有一个特殊的情况,我的代码的一部分需要使用仅支持 C++11 的工具进行编译,而另一部分使用 C++14 特性并且可以使用支持它们的标准 g++ 进行编译。我可以将代码的每一部分放入自己的库中并链接它们。但我想知道:一般来说,C++11 和 C++14 之间是否存在会导致(例如 ABI 相关)问题的差异?

c++ c++11 c++14

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

使用默认参数继承构造函数:哪个编译器是正确的?

在C++ 11中,您可以从基类继承所有构造函数.构造函数继承如何针对默认参数进行操作?

请考虑以下代码:

struct Base
{
    Base(int x, int y=0, int z=0)
    {

    }
};

struct Derived : public Base
{
    using Base::Base;
};

int main() {
    Base B(1,2);
    Derived D(2,2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这不能在MSVC13上编译,并出现以下错误:

 ..\constructor_test\main.cpp(16) : error C2660: 'Derived::Derived' : function does not take 2 arguments
Run Code Online (Sandbox Code Playgroud)

但是,它在GCC上运行正常(请参阅http://ideone.com/nNmXHo).所以我的问题是:

不应该生成一个,两个和三个参数的构造函数吗?哪个编译器在这里正确?MSVC13或GCC?如果GCC是正确的,MSVC是否有任何已知的解决方法(除了再次明确指定构造函数)?

c++ g++ visual-c++ c++11

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

java编译器的优化级别是什么?

因此,让我们考虑以下语句在循环内执行超过一百万次.

boolean validity = condition1 || condition2;
Run Code Online (Sandbox Code Playgroud)

可以安全地假设condition1condition2都有非常复杂的计算.所以既然这里有一个OR运算符,我认为首先分别检查condition1然后如果需要,条件2之后是明智的,比如,

boolean validity = condition1;
if( !validity )
    validity = condition2;
Run Code Online (Sandbox Code Playgroud)

我应该手动执行这样的优化还是java编译器会自动处理这些事情?

java optimization performance

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

C++:char test [100] vs array <char,100> vs string

如果我有一个我知道的长度恒定的字符串,我应该使用什么?

char test[100]
std::array<char, 100> test
std::string test
Run Code Online (Sandbox Code Playgroud)

谢谢!

c++

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