小编wol*_*ang的帖子

C++ 17:显式转换函数与显式构造函数+隐式转换 - 规则是否已更改?

Clang 6,clang 7和gcc 7.1,7.2和7.3都同意以下是有效的C++ 17代码,但在C++ 14和C++ 11下是不明确的.MSVC 2015和2017也接受它.但是,即使在c ++ 17模式下,gcc-8.1和8.2也拒绝它:

struct Foo
{
    explicit Foo(int ptr);
};

template<class T>
struct Bar
{
    operator T() const;
    template<typename T2>
    explicit operator T2() const;
};


Foo foo(Bar<char> x)
{
    return (Foo)x;
}
Run Code Online (Sandbox Code Playgroud)

接受它的编译器选择模板显式转换函数,Bar::operator T2().

拒绝它的编译器同意以下两者之间存在歧义:

  1. 显式转换函数Bar :: operator int()
  2. 首先使用隐式用户定义的转换从Bar<char>char,然后从所述隐式内置转换charint,然后将显式构造的Foo(INT).

那么,哪个编译器是对的?C++ 14和C++ 17之间标准的相关区别是什么?


附录:实际错误消息

这是错误gcc-8.2 -std=c++17.gcc-7.2 -std=c++14打印相同的错误:

<source>: In function 'Foo foo(Bar<char>)':    
<source>:17:17: error: call of overloaded 'Foo(Bar<char>&)' …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer implicit-conversion c++14 c++17

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

Android-非UI线程的屏幕外绘图

短版

是允许的,还是我需要使用UI线程?

编辑:对官方android文档中某个位置的引用将是理想的。

长版

Android文档明确指出,不允许“从UI线程外部访问Android UI工具包”。

另一方面,似乎允许从工作线程创建Bitmap对象,至少是通过示例代码完成的:http : //developer.android.com/guide/topics/fundamentals/processes-and-threads.html 显然,就线程而言,Bitmap类不被视为“ UI工具包”的一部分。

从非UI线程调用时,我有一段代码似乎可以正常工作。它涉及使用Bitmap.createBitmap(int,int,Bitmap.Config),新的Canvas(bitmap),Typeface.create()和文本绘图。我的代码未引用任何View对象。

有人可以指出我的一些文档,说我可以从后台线程执行这些操作吗?还是会导致随机崩溃?

multithreading android android-canvas

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