我最近遇到了一些奇怪的类,它有三个构造函数:
class Class
{
public:
explicit Class(int );
Class(AnotherClass );
explicit Class(YetAnotherClass, AnotherClass );
// ...
}
Run Code Online (Sandbox Code Playgroud)
这对我来说没有意义 - 我认为显式关键字是为了保护编译器选择的构造免受外来类型的影响.
这是允许的吗?如果它,它是什么意思?
可能重复:
C++中的explicit关键字是什么意思?
是否有理由将explicit
关键字用于不带任何参数的函数?它有什么影响吗?我想知道因为我刚刚遇到了这条线
explicit char_separator()
在页面末尾附近记录了boost :: char_separator(http://www.boost.org/doc/libs/1_47_0/libs/tokenizer/char_separator.htm),但在那里没有进一步解释.
我有一个类Base
定义explicit operator bool
:
struct Base {
virtual explicit operator bool() const {
return true;
}
};
Run Code Online (Sandbox Code Playgroud)
我有一个子类Derived
,定义operator bool
:
struct Derived : Base {
operator bool() const override {
return false;
}
};
Run Code Online (Sandbox Code Playgroud)
正如你可以观察到的那样,Derived::operator bool
明确没有标记explicit
,但是标记了override
,所以我期望编译器抱怨.然而,gcc和clang似乎都同意这是有效的.我的期望不合理吗?
而且,如果我使用如下的类,TakesBool(base)
不编译(如预期的那样),但是TakesBool(derived)
:
void TakesBool(bool b) {}
int main() {
//Base base; TakesBool(base); // compilation error (as expected)
Derived derived; TakesBool(derived);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这似乎表明Derived
有一个(非explicit
)operator …
我只是想知道是否有人知道你不允许使用隐式或显式运算符的接口的原因?
例如,这会引发编译时错误:
public static explicit operator MyPlayer(IPlayer player)
{
...
}
Run Code Online (Sandbox Code Playgroud)
"不允许在接口之间进行用户定义的转换"
谢谢,
C++20 引入了显式 (bool),它在编译时有条件地选择构造函数是否显式。
下面是我在这里找到的一个例子。
struct foo {
// Specify non-integral types (strings, floats, etc.) require explicit construction.
template <typename T>
explicit(!std::is_integral_v<T>) foo(T) {}
};
foo a = 123; // OK
foo b = "123"; // ERROR: explicit constructor is not a candidate (explicit specifier evaluates to true)
foo c {"123"}; // OK
Run Code Online (Sandbox Code Playgroud)
谁能告诉我explicit (bool)
除了 using 之外的任何其他用例std::is_integral
?
是否可以触发显式意图,但不能触发我的项目中的活动,而是针对某些其他应用程序中的活动.
我确定这段代码,我知道它正在运行
Intent i=new Intent(this,MyActivity.class);
Run Code Online (Sandbox Code Playgroud)
但是有可能做这样的事情
Intent i=new Intent(this,com.bzz.bla.bla.SomeActivity.class);
Run Code Online (Sandbox Code Playgroud)
我的意思是从其他应用程序显式启动活动的确切方式是什么(其他apk中包含的活动),这有可能吗?
我尝试了但它让我更加接近消息...... :(
我想知道为什么链接器不能简单地通过查询获得实际实现代码的实际.dll文件中的信息来完成它们的工作?我的意思是为什么链接器仍然需要.lib文件来进行隐式链接?
不是这种链接的导出和相对地址表足够吗?
无论如何,只使用.dll而没有.lib存根/代理文件的人可以进行隐式链接?
我认为Windows可执行加载器只是代表程序执行LoadLibrary/LoadLibraryEx调用(因此名称隐式链接),这是显式链接的主要区别.如果这是真的,那么在没有.lib的情况下明确地执行它应该表明它是可行的,如果没有隐式,对吧?或者我只是说非感觉?
任何帮助表示赞赏,非常感谢:)
geeko
考虑以下代码:
struct X{
explicit X(){}
explicit X(const X&){}
};
void foo(X a = X()){}
int main(){}
Run Code Online (Sandbox Code Playgroud)
使用C++ 14标准,GCC 7.1和clang 4.0都拒绝代码,这正是我所期望的.
但是,使用C++ 17(-std=c++1z
),它们都接受代码.什么规则变了?
对于两个编译器都表现出同样的行为,我怀疑这是一个bug.但据我所知,最新的草案仍然说,默认参数使用复制初始化 1的语义.同样,我们知道explicit
构造函数只允许直接初始化 2.
我的好友和我最近一直在阅读leveldb源代码.我们遇到了这个问题.在leveldb db/skiplist.h文件中,有一个构造函数声明:
explicit SkipList(Comparator cmp, Arena* arena);
Run Code Online (Sandbox Code Playgroud)
我知道带有单个参数的显式构造函数意味着没有构造函数参数的隐式类型转换.但是具有显式关键字的双参数构造函数意味着什么?这是C++ 11的新规则吗?
谢谢.
这是一个非常罕见的问题,并且肯定有许多变通方法,但我想了解实际发生了什么以及它为什么不起作用.
所以我在测试解决方案中有3个程序集,第一个程序集具有类型ClassA:
public class ClassA
{
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
第二个程序集引用第一个程序集并具有ClassB:
public class ClassB
{
public string Name { get; set; }
public static explicit operator ClassA(ClassB objB)
{
return new ClassA
{
Name = objB.Name
};
}
}
Run Code Online (Sandbox Code Playgroud)
它有一个显式运算符强制转换为类型ClassA.假设我们不能出于某种原因使用继承,只使用转换作为将一种类型转换为另一种类型的便捷方式.
现在,最后一个程序集引用第二个程序集(而不是第一个程序集!)并且类型为ClassC:
public class ClassC
{
public string Name { get; set; }
public static explicit operator ClassB(ClassC objC)
{
return new ClassB
{
Name = objC.Name
};
}
}
Run Code Online (Sandbox Code Playgroud)
它使用显式强制转换运算符的原因与ClassB相同.
现在有趣的部分:如果我尝试在我的代码中从ClassC转换为ClassB,如下所示:
ClassC objC = new ClassC(); …
Run Code Online (Sandbox Code Playgroud)