标签: explicit

multi-arg构造函数的显式关键字?

我最近遇到了一些奇怪的类,它有三个构造函数:

class Class
{
    public:
        explicit Class(int );

        Class(AnotherClass );

        explicit Class(YetAnotherClass, AnotherClass );

    // ...
}
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义 - 我认为显式关键字是为了保护编译器选择的构造免受外来类型的影响.

这是允许的吗?如果它,它是什么意思?

c++ explicit

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

没有参数的函数的c ++显式关键字

可能重复:
C++中的explicit关键字是什么意思?

是否有理由将explicit关键字用于不带任何参数的函数?它有什么影响吗?我想知道因为我刚刚遇到了这条线

explicit char_separator()

在页面末尾附近记录了boost :: char_separator(http://www.boost.org/doc/libs/1_47_0/libs/tokenizer/char_separator.htm),但在那里没有进一步解释.

c++ explicit

28
推荐指数
2
解决办法
7012
查看次数

虚拟显式转换运算符覆盖

我有一个类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 …

c++ overriding explicit operator-overloading c++11

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

为什么我不能使用带显式运算符的接口?

我只是想知道是否有人知道你不允许使用隐式或显式运算符的接口的原因?

例如,这会引发编译时错误:

public static explicit operator MyPlayer(IPlayer player)
{
 ...
}
Run Code Online (Sandbox Code Playgroud)

"不允许在接口之间进行用户定义的转换"

谢谢,

.net c# explicit type-conversion

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

显式 (bool) 的用例是什么

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

c++ explicit c++20

23
推荐指数
3
解决办法
1795
查看次数

Android目标组件的显式意图

是否可以触发显式意图,但不能触发我的项目中的活动,而是针对某些其他应用程序中的活动.

我确定这段代码,我知道它正在运行

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中包含的活动),这有可能吗?

我尝试了但它让我更加接近消息...... :(

android explicit android-intent

19
推荐指数
2
解决办法
3万
查看次数

当我们得到实际的.dll实现时,为什么还需要一个.lib存根文件?

我想知道为什么链接器不能简单地通过查询获得实际实现代码的实际.dll文件中的信息来完成它们的工作?我的意思是为什么链接器仍然需要.lib文件来进行隐式链接?

不是这种链接的导出和相对地址表足够吗?

无论如何,只使用.dll而没有.lib存根/代理文件的人可以进行隐式链接?

我认为Windows可执行加载器只是代表程序执行LoadLibrary/LoadLibraryEx调用(因此名称隐式链接),这是显式链接的主要区别.如果这是真的,那么在没有.lib的情况下明确地执行它应该表明它是可行的,如果没有隐式,对吧?或者我只是说非感觉?

任何帮助表示赞赏,非常感谢:)

geeko

dll linker explicit implicit

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

对C++的哪些更改使得使用显式构造函数的类的复制初始化工作?

考虑以下代码:

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.

1:dcl.fct.default/5 ; 2:class.conv.ctor/2

c++ explicit language-lawyer c++14 c++17

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

为什么双参数构造函数以显式关键字开头?

我的好友和我最近一直在阅读leveldb源代码.我们遇到了这个问题.在leveldb db/skiplist.h文件中,有一个构造函数声明:

explicit SkipList(Comparator cmp, Arena* arena);
Run Code Online (Sandbox Code Playgroud)

我知道带有单个参数的显式构造函数意味着没有构造函数参数的隐式类型转换.但是具有显式关键字的双参数构造函数意味着什么?这是C++ 11的新规则吗?

谢谢.

c++ explicit

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

显式强制转换运算符失败,并显示"未引用程序集"错误

这是一个非常罕见的问题,并且肯定有许多变通方法,但我想了解实际发生了什么以及它为什么不起作用.
所以我在测试解决方案中有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)

c# casting explicit

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