這個問題在這里已經有了答案: 如何避免對非建構式進行隱式轉換? (8 個回答) 4天前關閉。
如何防止浮點在函式呼叫時被隱式轉換為整數值?
#include <iostream>
void fn(int x) {
std::cout<<"fn("<<x<<")\n";
}
int main() {
std::cout<<"Hello, this is 301014 :)\n";
fn(2);
fn(3.5);
return 0;
}
這里的輸出分別是 2 和 3。
我正在用g -std=c 11 31014.cpp -o 31014 -v. 并且沒有提到3.5被轉換為3。
有沒有辦法防止或至少檢測到這種情況?
請幫幫我。
uj5u.com熱心網友回復:
有多種方法可以解決這個問題c 11.
方法一:你使用SFINAE函式模板。fnstd::enable_if
template<typename T>
typename std::enable_if<std::is_same<T, int>::value>::type fn(T x) {
std::cout << "fn(" << x << ")\n";
}
int main() {
std::cout << "Hello, this is 301014 :)\n";
fn(2); // works
// fn(3.5); // won't work;
}
演示
方法2:或者,洗掉模板推導中不應該發生的函式=delete。
void fn(int x) { // #1
std::cout << "fn(" << x << ")\n";
}
template<typename T> void fn(T) = delete; // #2
int main() {
std::cout << "Hello, this is 301014 :)\n";
fn(2); // works using #1
// fn(3.5); // won't work since it uses #2
}
演示
uj5u.com熱心網友回復:
解決此問題的另一種方法是添加template<typename T> void fn(T)=delete;(也適用于較舊的 c 標準):
#include <iostream>
template<typename T> void fn(T)=delete;
void fn(int x) {
std::cout<<"fn("<<x<<")\n";
}
int main() {
std::cout<<"Hello, this is 301014 :)\n";
fn(2);
fn(3.5); // now gives error
return 0;
}
uj5u.com熱心網友回復:
有幾種方法可以防止隱式轉換。
使用
std::enable_if和std::is_same。template <class T, std::enable_if_t<std::is_same_v<T,int>,bool> = false> void func(T x) { cout << x << endl; }在 C 20 中,可以使用
requirestemplate <class T> requires std::same_as(T,int) void func(T x) { // .... }使用
concept.template <class T> concept explicit_int = std::same_as<T,int>; void func(explicit_int auto x) { // ... }
uj5u.com熱心網友回復:
啟用正確的編譯器警告。
GCC 和 Clang 稱之為警告-Wconversion。
有了這個標志,我得到:
<source>:10:8: warning: implicit conversion from 'double' to 'int' changes value from 3.5 to 3 [-Wliteral-conversion]
fn(3.5);
~~ ^~~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/529845.html
標籤:C c 11海合会克
上一篇:day13-Servlet03
下一篇:淺談PHP設計模式的門面模式
